mod_rewrite问题:重写Cond %{REQUEST_FILENAME} !-f 匹配,即使REQUEST_FILENAME不应该(完全)匹配



由于某些原因,

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ ./rewrite.php?p=$1&%{QUERY_STRING} [L]

不适合这样的url http://site.com/index/var/val
所有其他url都可以,但这个不行。它开始工作时,我要么删除!-f将位于根目录下的index.php文件部分或重命名为其他文件(例如test.php)。所以在mod_rewrite的眼中site.com/index似乎等于site.com/index.php ?这些文件位于根目录中,因此不应该涉及任何其他(上层).htaccess文件。这不会只发生在索引上,例如,如果我创建/something.xml, test.com/something/…会突然停止工作。这只发生在某些服务器上。

有人知道为什么会发生这种情况吗?

p。/index目录不存在

故障模块是mod_negotiation,不是mod_rewrite。

在debian:

a2dismod negotiation
编辑:

更具体一点,这是Multiviews的效果,由mode_negotiation处理。因此,您可以保留模块并删除MultiViews处理:

Options -MultiViews
从文档:

MultiViews搜索是由MultiViews选项启用的。如果服务器接收到/some/dir/foo的请求,而/some/dir/foo不存在,那么服务器读取目录查找所有名为foo的文件。*,并有效地占用一个命名所有这些文件的类型映射,为它们分配相同的媒体类型和内容编码,如果客户端按名称要求其中一个文件的话。然后,它选择与客户端需求最匹配的文档,并返回该文档。

我还通过从

中删除MultiViews关键字来解决这个问题。
<Directory>

部分。

希望对你有帮助。

我相信${REQUEST_FILENAME}处理文件就好像它是直接提供给浏览器的。

我有一个类似的问题:

  • /content/detailed-page(重写URL, php解析)

文件以同样的方式返回给我:

  • /content/detailed-page.html (real file)

相关内容

最新更新