我的 .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]

最佳答案

听起来这里可能发生了两件事。

  • Mod_rewrite 似乎没有加载
  • 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/

    10-13 03:36