我在 mod_rewrite RewriteCond 条目中的文件测试操作存在问题,该条目正在测试是否%{REQUEST_FILENAME}
存在。似乎%{REQUEST_FILENAME}
我不是一条绝对路径,而是一条植根于的路径DocumentRoot
。
配置
我<VirtualHost>
在我的 apache 2.2.9 配置中的一个块中有这个:
RewriteEngine on
RewriteLog /tmp/rewrite.log
RewriteLogLevel 5
#push virtually everything through our dispatcher script
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/([^/]*)/?([^/]*) /dispatch.php?_c=$1&_m=$2 [qsa,L]
已尝试诊断
该规则是通过脚本路由对不存在的文件或目录的请求的常用习惯用法。麻烦的是,即使文件确实存在,它也会触发。
如果我删除规则,我可以请求普通文件就好了。但是有了规则,这些请求就会被定向到 dispatch.php
重写日志跟踪
这是我在 rewrite.log 中看到的
init rewrite engine with requested uri /test.txt
applying pattern '^/([^/]*)/?([^/]*)' to uri '/test.txt'
RewriteCond: input='/test.txt' pattern='!-f' => matched
RewriteCond: input='/test.txt' pattern='!-d' => matched
rewrite '/test.txt' -> '/dispatch.php?_c=test.txt&_m='
split uri=/dispatch.php?_c=test.txt&_m= -> uri=/dispatch.php, args=_c=test.txt&_m=
local path result: /dispatch.php
prefixed with document_root to /path/to/my/public_html/dispatch.php
go-ahead with /path/to/my/public_html/dispatch.php [OK]
因此,在我看来,REQUEST_FILENAME 被呈现为来自文档根目录的路径,而不是文件系统根目录,这可能是文件测试操作符失败的原因。
任何解决此问题的指示都非常感谢...
我也花了一些时间才知道,但是mod_rewrite 文档中提到了原因:
这就是为什么它可以在
.htaccess
vhost 的 conf 文件中工作,但不能在虚拟主机的 conf 文件中工作。(这也是为什么DOCUMENT_ROOT
围绕问题添加作品的原因)。我通过将文档根显式写入条件来解决此问题
这在虚拟主机(或服务器)上下文中不会按预期工作,因为指令在请求映射到文件系统之前处理,这与在目录(或
.htaccess
)上下文中使用时不同。在请求被映射到文件系统之前,REQUEST_FILENAME
与 相同REQUEST_URI
,即。根相对 URL 路径。但是,您可以使用前瞻来获取请求最终将映射到的绝对文件名。例如: