在我的服务器(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