Apache ReWrite Condition 认为目录不是目录吗?

Apache ReWrite Condition 认为目录不是目录吗?

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

它说,“‘wpsa’ 是一个目录吗?” -> “不是”。但实际上它是。为什么它认为我的目录不是目录?

如果我添加:

ReWriteRule ^/wpsa - [L,NC]

在此规则之前,它会加载目录。但我不应该创建一个对每个目录都不执行任何操作的规则,对吧?这就是 -f/-d 条件的用途。

答案1

您的 webroot 不是/(对吗?),所以-d没有命中是正确的。它正在尝试匹配/wpsa/文件系统,实际上 - 而不是相对于 webroot。

它之所以给你/wpsa/作为字符串输入而不是/path/to/webroot/wpsa按预期工作,是因为你%{REQUEST_FILENAME}在错误的上下文中使用了。

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

来自文档

请求文件名

与请求匹配的文件或脚本的完整本地文件系统路径(如果在引用 REQUEST_FILENAME 时服务器已确定此路径)。否则,例如在虚拟主机上下文中使用时,与 REQUEST_URI 的值相同。

<VirtualHost>您似乎在或上下文中使用它<Location>,这使得它的功能与相同%{REQUEST_URI}。如果您想将其保留在该上下文中,请尝试:

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

相关内容