.php 扩展名中忽略 mod_rewrite !-f 和 !-d

.php 扩展名中忽略 mod_rewrite !-f 和 !-d

我在 Apache 2 服务器上有一个 .htaccess 文件:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

当任何针对不存在的文件或目录的请求被交给 index.php 程序进行处理时,规则会按预期工作。

如果请求的文件存在(例如服务器上的任何 .txt 或 .js 文件),该规则还会绕过重定向。

但是,任何以 .php 结尾的文件都无法正确处理。文件存在,但 !-f 和 !-d 规则被忽略。只需将扩展名更改为 .phpt 并请求相同的文件(在末尾添加“t”)即可显示文件内容。

有什么线索可以解释为什么只有 .php 文件会跳过 !-f 和 !-d 规则?

答案1

使用一对条件 + 规则,mod_rewrite 的工作会更加可预测。您的代码如下:

RewriteRule ^index\.php$ - [L]

由于 index.php 是一个文件,因此已经与下一行匹配。

尝试:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* /index.php [L]
</IfModule>

我猜 . 只会匹配一个字符,所以我将 . 更改为 .*

相关内容