我有一个目录(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
。