Php 不同的重写条件%{REQUEST_FILENAME}-f解释

Php 不同的重写条件%{REQUEST_FILENAME}-f解释,php,apache,.htaccess,mod-rewrite,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(杰西)与fedora 24(二十四) 以下设置: /.htaccess(使用上述规则) /index.php

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

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php?__s=$1 [L,QSA]
现在我有了不同的行为 debian 8(杰西)fedora 24(二十四)

以下设置:

  • /.htaccess(使用上述规则)
  • /index.php
  • /示例/test.php
如果我调用以下URL:

debian和fedora的行为不同

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

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

有人能解释为什么相同的.htaccess在debian和fedora上有不同的解释吗

有人能解释为什么相同的.htaccess在debian和fedora上有不同的解释吗

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

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

Options -MultiViews

Apache的内容协商模块
使用,该模块在
mod_rewrite
之前运行,并使Apache服务器匹配文件扩展名。因此,如果
/test
是URL,那么Apache将提供匹配的
/test.php

非常有用的答案。无论如何,谢谢你。我会试试。如果你隐藏了一个扩展,那么就指定一个可见的例程来实现它。