服务器:Debian Jessie Apache:2.4.9-1 PHP:5.5
我想要的是所有非文件和非目录redirect到我自己处理它们的index.php。 由于我的项目的性质,我必须从一个虚拟主机内部工作。
我正在使用虚拟主机(vHosts)和mod_rewrite在我正在工作的Web项目。 这是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按预期工作,重写规则将请求redirect到index.php。 但是当我尝试访问服务器上的文件时,例如:
foo.com/css/style.css
位于:
/srv/foo/main/www/css/style.css
我的请求被redirect到index.php
这很奇怪,因为重写条件语句应该解决这个问题。
所有文件夹权限都设置为755,所有文件都设为644。
我已经能够毫无疑问地确认重写条件是不匹配的。 我可以通过查看Apache的错误日志,并为mod_rewrite启用debugging输出来看到这一点。
为什么两个RewriteCond语句不正确匹配?
他们可能没有看到vHost DocumentRoot?
更新:closures重写引擎允许我到我正在testing的文件。 IE,我的URI是正确的。 我知道我的路是好的,条件只是因为某种原因失败了。
对于任何人使用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}会给你一个上下文敏感的文档根目录。 IE,虚拟主机之后的文档根目录已经被应用。 但它不会给你的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
其余的很容易。 很棒的酱。 希望这可以帮助!