请求匹配的重写返回权限拒绝

发布于 2025-01-18 22:18:49 字数 2283 浏览 2 评论 0原文

我正在遇到一个奇异的apache错误。我想从/api/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,它会抱怨我没有访问资源的权限。我必须有许可,因为如果没有重写,我可以访问文件。我应该如何重写最后一个重写,以便它可以使用图像?

我添加了日志记录指令loglevel警报重写: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]

我可以访问url mydomain.com/media/32/ee/0e60731bcb220c7c7c7b.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>

I am experiencing a bizarre apache error. I'd like to rewrite all requests from /api/media/fi/le/path.jpg to /media/fi/le/path.jpg

This are rewrite rules setup in virtual host:

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]

If I point the browser to /media/fi/le/path.jpg, the image gets server successfully. If I go to /api/media/fi/le/path.jpg it complains that I do not have permission to access the resource. I must have permission, because I can access the file if no rewrites are done. How should I rewrite the last RewriteRule so that it would serve the images?

I added logging directive LogLevel alert rewrite:trace6 to see what the apache is doing under the covers. This are the results:

 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]

I can visit the url mydomain.com/media/32/ee/0e60731bcb220c7c7b.jpg manually and the image gets server with no problem. What am I missing?

Complete .conf file for virtual host:

<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>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

寂寞陪衬 2025-01-25 22:18:49

重写引擎有奇怪的行为。

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

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

There is weird behaviour with rewrite engine.

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

Will always return forbidden. After mv media images and changing the above directive to RewriteRule /api/media/(.*) /images/$1 [L], permission error is gone.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文