不同的RewriteCond%{REQUEST_FILENAME}!-f解释

时间:2017-04-25 08:18:30

标签: php apache .htaccess mod-rewrite

我已经配置了一个通用的重写规则来将所有请求转发到index.php的不存在的路径:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php?__s=$1 [L,QSA]

现在我有不同的行为 debian 8(jessie) fedora 24(二十四)相比

以下设置:

  • / .htaccess(以上规则)
  • 的index.php
  • /example/test.php

如果我拨打以下网址:http://myserver.local/example/test

debian和fedora的行为不一样。

在debian上,apache说“ok,在示例文件夹中找不到文件测试或文件夹测试”转发到index.php(预期行为)。

在fedora上,apache说“哦,我找到了一个名为test.php的文件,不要转发到index.php。所以我将test.php发送给我的客户端。” 如果我删除或重命名test.php,它会按预期转发到index.php。

是否有人能够解释为什么同样的.htaccess以不同的方式在debian和fedora上进行交互?

1 个答案:

答案 0 :(得分:1)

  

是否有人能够解释为什么同样的.htaccess以不同的方式在debian和fedora上进行交互?

这很可能是由于Fedora主机上处于启用状态的MultiViews选项。

只需将此行放在.htaccess的顶部即可将其禁用:

Options -MultiViews
Apache's content negotiation modulemod_rewrite/test之前运行并使Apache服务器匹配文件扩展名。因此,如果/test.php是网址,那么Apache将提供匹配的template <typename F> void common(F f) { foo(); bar(); f(); foobar(); } void MyFunction() { common([](){}); } void MyFunctionWithABonus() { common(&doBonusStuff); }