如何通过.htaccess将图像请求重定向到另一个目录?

时间:2018-12-23 13:36:49

标签: php regex .htaccess mod-rewrite

图片位于文件名前 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'));

1 个答案:

答案 0 :(得分: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/<year>/<month>/<filename>.jpg的URL,其中<year>是任何4位数字的序列,而<month>是任何2位数字的序列。您可以根据需要使用正则表达式来表示具体或一般。

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

不需要PHP。

更新:如果/mnt/images实际上位于不同的硬盘上(DocumentRoot之外)但在同一台服务器上,则需要创建一个{{1 }},将Alias映射到本地URL空间。您还将需要一个适当的/mnt/images容器,该容器允许访问此位置。即使最终使用PHP帮助获取图像,您仍然需要授予PHP访问权限。

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

<Directory>

然后,RewriteRule ^wp-content/uploads/\d{4}/\d\d/(.+\.jpg)$ navigator.php?src=$1 [L] URL参数将仅保留所请求文件的基本名称。