【问题标题】:How to redirect image requests to another dir via .htaccess?如何通过 .htaccess 将图像请求重定向到另一个目录?
【发布时间】:2018-12-23 13:36:48
【问题描述】:

图片按文件名的前2个字符在文件夹中,例如stack_help_me.jpg文件将在/mnt/images/st/stack_help_me.jpg文件夹中。

任务是使所有对特定子文件夹图片的请求(例如上传)都重定向到所需的文件。例如,/wp-content/uploads/2018/12/stack_help_me.jpg/mnt/images/st/stack_help_me.jpg

如何纯粹在.htaccess中做到这一点,有可能吗?

这在 PHP 中似乎是可以理解的(尽管可能与 .htaccess 规则有关的错误)。这是我尝试过的:

.htaccess

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} /wp-content/uploads/\.(jpg|jpeg|png|gif)$ [NC]
RewriteRule (.*) navigator.php?&src=$1 [L]
</IfModule>

navigator.php

$real_img_path = '/mnt/images';
$full_path = $_GET['src']; // /wp- 
content/uploads/2018/12/toster_help_me.jpg
$only_fname = substr($full_path, strrpos($full_path, '/') + 1); // 
toster_help_me.jpg
$image = $real_img_path . '/' . substr($only_fname, 0, 2) . '/' . 
$only_fname; // /mnt/images/to/toster_help_me.jpg
fpassthru(fopen($image, 'rb'));

【问题讨论】:

  • 是的,现在我知道 htaccess 只能从根目录工作并且只使用 htaccess 是不可能的。

标签: php regex .htaccess mod-rewrite


【解决方案1】:
RewriteCond %{REQUEST_URI} /wp-content/uploads/\.(jpg|jpeg|png|gif)$ [NC]

...而且只使用 htaccess 是不可能的。

只使用.htaccess 可能的。但是,上面的正则表达式与 /wp-content/uploads/2018/12/stack_help_me.jpg 形式的请求不匹配(如您的示例所示)。

您可以在 .htaccess 文件的顶部,任何现有指令之前执行以下操作:

RewriteEngine On

RewriteRule ^wp-content/uploads/\d{4}/\d\d/((..).*\.jpg)$ /mnt/images/$2/$1 [L]

这专门匹配 /wp-content/uploads/&lt;year&gt;/&lt;month&gt;/&lt;filename&gt;.jpg 形式的 URL,其中 &lt;year&gt; 是任何 4 位序列,&lt;month&gt; 是任何 2 位序列。您可以根据需要使用正则表达式具体或通用。

$1 是对第一个捕获的子模式的反向引用,例如。 stack_help_me.jpg。而$2 是对第二个捕获的子模式(在第一个子模式内)的反向引用,即文件名的前两个字符,例如st

PHP 不是必需的。

更新:如果 /mnt/images 实际上位于不同的 HDD 上(DocumentRoot 之外)但在同一服务器上,那么您需要在服务器配置中创建一个 Alias/mnt/images 映射到本地 URL 空间。您还需要一个适当的&lt;Directory&gt; 容器,以允许访问此位置。即使您最终使用 PHP 来帮助获取图像,您仍然需要授予 PHP 访问权限。

要将请求路由到 PHP 脚本,您可以修改上述指令,如下所示:

RewriteRule ^wp-content/uploads/\d{4}/\d\d/(.+\.jpg)$ navigator.php?src=$1 [L]

src URL 参数将只保存被请求文件的基本名称。

【讨论】:

  • 我已经阅读了 htaccess 文档,它说重定向只能到文档根目录内的另一个目录/文件,意思是。我可以像这样使用 htaccess 的唯一方法是将软符号链接添加到 docroot (wordpress) 目录中的 /mnt/ 目录。我说的对吗?
  • 您问题中的所有内容都表明这都在同一个文档根目录中? /mnt 目录在哪里? (顺便说一句,“重定向”可以从/到任何地方。但是,我们在这里所做的是“内部重写”,而不是严格意义上的“重定向”——这意味着 外部重定向。)跨度>
  • 在另一个硬盘上。站点分配在 /home/user/www/domain/public_www/ ,图像分配在 /mnt/images/
  • 那是一个不同的主机吗?您有权访问服务器配置吗?如果它是映射在同一服务器上的硬盘驱动器,您可以使用Alias。如果反向代理托管在具有不同 主机名 的不同服务器上,您可以配置反向代理。
  • 使用 PHP 的效率肯定会降低。但是如果文件在文档根目录之外,那么您可能需要创建一个Alias 吗?虚拟主机/服务器配置中的Alias 是我的首选 - 如果您更改服务器,这将成为服务器配置的一部分(与符号链接不同)。一些 Apache 指令符号链接被操作系统处理之前被处理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-07
  • 2019-11-24
  • 2011-08-08
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多