我们希望像 Apache 擅长的那样提供图像,当客户端请求缩略图时,请求将如下所示:[http://host/photos/im/image_w200.jpg](w200 是缩略图所要求的宽度)。
有时缩略图不存在。当它们不存在时,我们希望 Apache 将请求转发给我们的应用程序。该请求将如下所示 [http://host/create_thumbnail?file=image_w250.jpg]。应用程序将创建缩略图,并重定向回原始请求。
当我在 /home/dev/x/y/mediadir 中有普通文件和目录时,此方法运行良好。但是 /home/dev/x/y/mediadir/photos 现在是指向 /home/dev/photos 目录的符号链接。因此现在,即使文件存在,它也会始终传递 !-f RewriteCond 并重写以缩略图显示照片。
我尝试过的事情:
- 服务器可以访问符号链接目录。当我取出重写块时,它工作正常
- 我尝试过 !-l、!-F 和 !-U。!-U 在文件存在时提供文件,但当文件不存在时,apache 不会重写请求。!-l 和 !-F 与 !-f 的作用相同
有人有什么建议吗?
<VirtualHost *:443>
#... cut ...
RewriteLog /home/dev/logs/rewrite.log
RewriteLogLevel 3
Alias /media/ /home/dev/x/y/mediadir/
<Directory /home/dev/x/y/mediadir>
Order allow,deny
Allow from all
Options FollowSymLinks
RewriteEngine on
RewriteCond photos/../$ !-f
RewriteRule ^photos/../(.+)$ https://%{HTTP_HOST}/create_thumbnail?file=$1
</Directory>
答案1
我使用了两个 RequestCond ( ),而不是RewriteCond photos/../$ !-f
一个。第一个检查 REQUEST_FILENAME 是否与正则表达式匹配,第二个检查文件是否存在。这对我来说很有效。
RewriteCond %{REQUEST_FILENAME} photos/../.+
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^photos/../(.+)$ https://%{HTTP_HOST}/create_thumbnail?file=$1
答案2
我有点搞不清楚你的路径是什么,因为你引用了 /mediadir,但没有 /mediadir(从根目录引用;不在文件系统中,也不在 apache 中)。所以我真的不知道你的意思,但也许你可以通过添加以下内容来修复它:
<Directory /path/to/photos/>
Order allow,deny
Allow from all
</Directory>
你的重写日志说了什么?