有人可以解释这个奇怪的mod_rewrite正则表达式行为

时间:2010-10-25 23:22:00

标签: php regex mod-rewrite

我一直在研究用于调试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的正则表达式引擎是如何工作的,我会对它开放。最初的问题仍然存在......

1 个答案:

答案 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会更好。如果您无法访问配置,那么您几乎可以做一些类似于您现在尝试的操作。