图片位于文件名前 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'));
答案 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参数将仅保留所请求文件的基本名称。