服务器:Debian Jessie Apache:2.4.9-1 PHP:5.5
我希望所有非文件和非目录都重定向到 index.php,然后我自己处理它们。由于我的项目性质,我必须在虚拟主机内工作。
我在正在进行的 Web 项目中使用虚拟主机 (vHosts) 和 mod_rewrite。这是 vHost 文件...
<VirtualHost *:80>
ServerName foo.com
ServerAlias www.foo.com
ServerAdmin [email protected]
DocumentRoot /srv/foo/main/www/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php [L]
</IfModule>
</VirtualHost>
vHost 工作正常,重写规则按预期将请求重定向到 index.php。但是,当我尝试访问服务器上的文件时,例如:
foo.com/css/style.css
位于:
/srv/foo/main/www/css/style.css
我的请求被重定向到 index.php
这很奇怪,因为重写条件语句应该可以解决这个问题。
所有文件夹权限设置为 755,所有文件权限设置为 644。
我已经能够毫无疑问地确认重写条件是匹配的,而实际上它们不应该匹配。我可以通过查看 apache 的错误日志并启用 mod_rewrite 的调试输出来看到这一点。
为什么两个 RewriteCond 语句错误地匹配?
他们可能没有看到 vHost DocumentRoot 吗?
更新:关闭重写引擎后,我就可以访问正在测试的文件。也就是说,我的 URI 是正确的。我知道我的路径是好的,只是由于某种原因,条件不合格。
答案1
对于任何使用带有虚拟主机的 Apache 2.4 并希望在所述 vHost 内使用 mod_rewrite 并带有重写条件(需要检查 vHost 内的文件或文件夹)的人来说,这是如何执行重写条件...
<VirtualHost *:80>
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{CONTEXT_DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteCond %{CONTEXT_DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteRule ^(.*)$ /index.php [L]
</IfModule>
</VirtualHost>
我想到了这个并且它似乎效果很好。
说明...
%{CONTEXT_DOCUMENT_ROOT}%{REQUEST_URI}
将为您提供上下文相关的文档根目录。即,应用虚拟托管后的文档根目录。但它不会为您提供 URI,因此我们需要添加来%{REQUEST_URI}
完成工作。
CONTEXT_DOC_ROOT == /srv/foo/main/www
REQUEST_URI == /css/style.css
CONTEXT_DOC_ROOT + REQUEST_URI == /srv/foo/main/www/css/style.css
剩下的就很简单了。酱汁棒极了。希望这能有所帮助!