我一直在研究用于调试mod_rewrite的脚本,在测试他们的正则表达式系统时,我有一些奇怪的结果。我想知道这是否是mod_rewrite正则表达式引擎的正常行为,或者我的代码中的某些部分是否导致它。
请求的网址:http://myurl.com/path/to/something
.htaccess有:RewriteRule to where
使用我的调试系统,使用RewriteRule时会发生以下情况:
path/to/something -> where/to/something
不应该是path/where/something
???
这是完整的.htaccess文件
RewriteEngine On
RewriteBase / ModRewriteTester
RewriteRule。* - [E = ORIG:$ 0]
RewriteRule到哪里
RewriteRule。* - [E = MODD:$ 0]
RewriteRule。* index.php
然后我有一个PHP脚本正在读取环境变量$_SERVER['REDIRECT_ORIG']
和$_SERVER['REDIRECT_MODD']
,这就是我获得前面提到的路径的地方。
如果有人知道一个更好的方法来明确地显示mod_rewrite的正则表达式引擎是如何工作的,我会对它开放。最初的问题仍然存在......
答案 0 :(得分:1)
你的规则:
RewriteRule to where
...将重写与匹配的网址,并将其替换为表示对 / where 的请求的网址。在某些情况下,mod_rewrite可以尝试重新添加Apache认为是PATH_INFO的内容,可以创建如下情况:
path/to/somewhere -> PATH_INFO = /to/somewhere path/to/somewhere -> /where (append PATH_INFO) -> /where/to/somewhere
要检查您的方案中是否属于这种情况,您可以将DPI
flag添加到RewriteRule
以丢弃PATH_INFO(如果存在)。这看起来像这样:
RewriteRule to where [DPI]
在这种情况下,您最终只会使用网址 / where 。如果您想将替换为 ,同时保留其余的网址,则需要更像这样的规则:
RewriteRule (.*?/)?to(/.*)? $1where$2
就调试规则集而言,如果您可以访问Apache配置,那么使用RewriteLog
directive并使用足够高的RewriteLogLevel
会更好。如果您无法访问配置,那么您几乎可以做一些类似于您现在尝试的操作。