Apache2 mod_rewrite干净的URL – 工作,但文件不可访问

服务器: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

其余的很容易。 很棒的酱。 希望这可以帮助!