Apache重写条件认为目录不是目录?

在我的服务器(Apache2,Ubuntu 10.04)上, wpsa是我的webroot中的一个目录。 当访问url mysite.com/wpsa时,当请求的文件是一个目录时不应该发生的ReWriteRule运行。

这些是我的规则:

 RewriteCond %{REQUEST_URI} !^/index.php$ RewriteCond %{REQUEST_URI} !^/$ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule .* /000_ROUTE.php [L] 

这是从重写日志:

 applying pattern '.*' to uri '/wpsa/' RewriteCond: input='/wpsa/' pattern='!^/index.php$' => matched RewriteCond: input='/wpsa/' pattern='!^/$' => matched RewriteCond: input='/wpsa/' pattern='!-f' => matched RewriteCond: input='/wpsa/' pattern='!-d' => matched rewrite '/wpsa/' -> '/000_ROUTE.php' local path result: /000_ROUTE.php 

它说,“是不是一个driectory?” – >“不,这不是”。 但确实如此。 为什么它认为我的目录不是一个目录?

如果我添加:

 ReWriteRule ^/wpsa - [L,NC] 

在这个规则之前,它加载目录。 但是我不应该为每个目录创build一个什么都不做的规则,对吗? 这就是-f / -d条件。

你的webroot不是/ (对吧?),所以这是正确的,没有得到一个命中。 它试图匹配/wpsa/文件系统,字面上 – 不相对于webroot。

/wpsa/作为您的stringinput而不是/path/to/webroot/wpsa是,您将在错误的上下文中使用%{REQUEST_FILENAME}

在已经完成文件系统映射的上下文中使用%{REQUEST_FILENAME} ,如在<Directory>块或.htaccess文件中,将返回完整path, -d将按照您的预期工作。

从文档 :

REQUEST_FILENAME

如果在引用REQUEST_FILENAME时服务器已经确定了该文件或脚本的完整本地文件系统path, 否则,如在虚拟主机上下文中使用时,与REQUEST_URI的值相同。

您似乎正在使用它在<VirtualHost><Location>上下文中,这使得它在function上与%{REQUEST_URI}相同。 如果你想保持在这种情况下,请尝试:

 RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d