与 RewriteRule 匹配的请求返回权限被拒绝

与 RewriteRule 匹配的请求返回权限被拒绝

我遇到了一个奇怪的 Apache 错误。我想重写所有来自 到/api/media/fi/le/path.jpg的请求/media/fi/le/path.jpg

这是虚拟主机中设置的重写规则:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule /api/v1/* /src/api/v1/index.php [L]
RewriteRule /api/media/(.*) /media/$1 [L]

如果我将浏览器指向/media/fi/le/path.jpg,图像将成功获取服务器。如果我去/api/media/fi/le/path.jpg它会抱怨我没有访问该资源的权限。我必须获得许可,因为如果不进行重写,我就可以访问该文件。我应该如何重写最后一个 RewriteRule 以便它可以提供图像?

我添加了日志指令LogLevel alert rewrite:trace6来查看 apache 在幕后做了什么。这是结果:

 init rewrite engine with requested uri /api/media/32/ee/0e60731bcb220c7c7b.jpg
 applying pattern '/api/v1/*' to uri '/api/media/32/ee/0e60731bcb220c7c7b.jpg'
 applying pattern '/api/media/(.*)' to uri '/api/media/32/ee/0e60731bcb220c7c7b.jpg'
 rewrite '/api/media/32/ee/0e60731bcb220c7c7b.jpg' -> '/media/32/ee/0e60731bcb220c7c7b.jpg'
 local path result: /media/32/ee/0e60731bcb220c7c7b.jpg
 go-ahead with /media/32/ee/0e60731bcb220c7c7b.jpg [OK]

我可以mydomain.com/media/32/ee/0e60731bcb220c7c7b.jpg手动访问该网址,并且图像可以毫无问题地获取服务器。我缺少什么?

完整的.conf文件:

<IfModule mod_ssl.c>
  <VirtualHost *:443>
        DocumentRoot /home/user/project/src
        ServerName project.com
        ErrorLog logs/project-error_log
        CustomLog logs/project-access_log common
        DirectoryIndex index.php

        <Directory /home/user/project/src>
            Options -Indexes +FollowSymLinks
            AllowOverride None
            Require all granted
        </Directory>

        LogLevel alert rewrite:trace6
        RewriteEngine on
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule /api/v1/* /api/v1/index.php
        RewriteRule /api/media/(.*) /media/$1 [L]

        SSLCertificateFile /etc/letsencrypt/live/project.com/cert.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/project.com/privkey.pem
        Include /etc/letsencrypt/options-ssl-apache.conf
        SSLCertificateChainFile /etc/letsencrypt/live/project.com/chain.pem
    </VirtualHost>
</IfModule>

答案1

重写引擎有奇怪的行为。

RewriteRule /api/media/(.*) /media/$1 [L]

永远禁止返回。mv media images将上述指令更改为后RewriteRule /api/media/(.*) /images/$1 [L],权限错误就消失了。

相关内容