我的 .htaccess 中有一个重写规则:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^vt$ vt.php [L]
</IfModule>
如果我的网站目录中存在文件“vt”,则重写完成。
但是如果文件“vt”不存在,apache2 只会给出 404 错误。
所以看起来apache2在检查文件stat后会重写。
我该如何解决?
我认为这是一个错误。我最终使用此规则来避免使用两个文件(vt 和 vt.php)。
RewriteRule ^vt$ - [H=application/x-httpd-php]
最佳答案
听起来这里可能发生了两件事。
Multiviews
使它看起来好像加载了 mod_rewrite Multiviews
所做的,是 mod_negotiation 的一部分,如果它缺少诸如扩展之类的东西,它会尝试“猜测”请求的目的。因此,在打开 Multiviews
的情况下,如果它看到对 /vt
的请求并且文件 vt
不存在,它会猜测并找到 /vt.php
并提供该文件,否则它什么都不做并返回 404。这将使它看起来好像mod_rewrite 规则实际上正在应用。如果 mod_rewrite 实际打开,那么即使 mod_negotiation 已打开并且文件丢失(这将导致 404),它也会应用规则。所以 1. 确保 mod_rewrite 实际加载。为此,请检查您的 httpd.conf 文件,应该有一行如下所示(未注释):
LoadModule rewrite_module modules/mod_rewrite.so
或者您可以尝试删除
<IfModule mod_rewrite.c>
容器,如果您收到 500 服务器错误,则不会加载 mod_rewrite。然后 2. 在您的 htaccess 文件中添加这一行以关闭
Multiviews
:Options -Multiviews
关于apache2 在重写之前给出 404,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19493891/