重写无法与符号链接一起使用

重写无法与符号链接一起使用

我们希望像 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>

你的重写日志说了什么?

相关内容