![Apache 对不存在的符号链接文件进行错误的 URL 重写](https://linux22.com/image/774201/Apache%20%E5%AF%B9%E4%B8%8D%E5%AD%98%E5%9C%A8%E7%9A%84%E7%AC%A6%E5%8F%B7%E9%93%BE%E6%8E%A5%E6%96%87%E4%BB%B6%E8%BF%9B%E8%A1%8C%E9%94%99%E8%AF%AF%E7%9A%84%20URL%20%E9%87%8D%E5%86%99.png)
我有一个目录(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 响应。我的意思是:
foo.com/uploads/file1.txt
-> 文件已送达(正确)foo.com/uploads/file2.txt
-> Apache 404ErrorDocument
服务(正确)bar.com/uploads/file1.txt
-> 文件已送达(正确)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
。