Apache2 mod_rewrite 清理 URL - 工作正常,但文件无法访问

Apache2 mod_rewrite 清理 URL - 工作正常,但文件无法访问

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

剩下的就很简单了。酱汁棒极了。希望这能有所帮助!

相关内容