Apache 对不存在的符号链接文件进行错误的 URL 重写

Apache 对不存在的符号链接文件进行错误的 URL 重写

我有一个目录(foo/uploads),其中包含 1 个文件:file1.txt

我已经创建了此目录的符号链接(bar/uploads

这是我的.htaccess文件bar

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

这是我的 vhost 文件:

<VirtualHost *:80>
    ServerName bar.com
    DocumentRoot /var/www/bar

    <Directory /var/www/bar>
        allow from all
        order allow,deny
        AllowOverride All
    </Directory>
</VirtualHost>

我遇到的问题是,如果我在使用符号链接文件夹时尝试访问不存在的文件,它不会产生 404 响应。我的意思是:

  1. foo.com/uploads/file1.txt-> 文件已送达​​(正确)
  2. foo.com/uploads/file2.txt-> Apache 404ErrorDocument服务(正确)
  3. bar.com/uploads/file1.txt-> 文件已送达​​(正确)
  4. bar.com/uploads/file2.txt-> 继续index.php(错误)

我也尝试过包括:

RewriteCond %{REQUEST_FILENAME} !-l

之前RewriteRule,但是那没有什么区别。

有人知道我需要做什么吗?

答案1

如果您只希望在通过以下方式访问时应用前端控制器,bar.com那么您可以Host在规则中检查请求的标头。例如:

RewriteCond %{HTTP_HOST} (^|\.)bar\.com [NC]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

或者,排除/uploads子目录:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^uploads/ index.php [L]

或者,在子目录中包含另一个.htaccess文件/uploads来覆盖父前端控制器模式。只需禁用(或启用- 假设 mod_rewrite 继承未启用)子目录中的重写引擎:

# /uploads/.htaccess
RewriteEngine Off

或者,.htaccess完全禁用覆盖并将这些指令移动到 vHost<Directory /var/www/bar>内的容器bar.com

相关内容