【问题标题】:Can someone explain this strange mod_rewrite regex behavior有人可以解释这种奇怪的 mod_rewrite 正则表达式行为吗
【发布时间】:2011-04-30 11:57:59
【问题描述】:

我一直在编写调试 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 文件

重写引擎开启

RewriteBase /ModRewriteTester

重写规则 .* - [E=ORIG:$0]

重写规则到哪里

重写规则 .* - [E=MODD:$0]

重写规则 .* index.php

然后我有一个读取环境变量$_SERVER['REDIRECT_ORIG']$_SERVER['REDIRECT_MODD'] 的php 脚本,这就是我获得前面所述路径的地方。

如果有人知道更好的方法来明确展示 mod_rewrite 的正则表达式引擎如何工作,我愿意接受。最初的问题仍然存在......

【问题讨论】:

  • 你确定是where/to/something 而不仅仅是where
  • 是的。据我所知,这就是返回的内容。

标签: php regex mod-rewrite


【解决方案1】:

你的规则:

RewriteRule to where

...将重写一个匹配 to 的 URL,并将其替换为表示对 /where 的请求的 URL。在某些情况下,mod_rewrite 可能会尝试重新添加 Apache 认为是 PATH_INFO 的内容,这可能造成如下情况:

path/to/somewhere -> PATH_INFO = /to/somewhere 路径/到/某处-> /哪里 (附加 PATH_INFO)-> /where/to/somewhere

要检查您的场景是否属于这种情况,您可以将 DPI flag 添加到 RewriteRule 以丢弃 PATH_INFO(如果存在)。这看起来像这样:

RewriteRule to where [DPI]

在这种情况下,您最终会得到 URL /where。如果您想用 where 替换 to,同时保留 URL 的其余部分,则需要一个更像这样的规则:

RewriteRule (.*?/)?to(/.*)? $1where$2

就调试规则集而言,如果您可以访问 Apache 配置,则最好使用具有足够高的 RewriteLogLevelRewriteLog directive。如果您无权访问配置,则几乎只能执行与您现在尝试执行的操作类似的操作。

【讨论】:

  • RewriteRule to where [DPI] 产生“内部服务器错误”,RewriteRule (.*?/)?to(/.*)? $1where$2 产生以下结果:path/to/thing -> path/where/thing/to/thing
  • @lococobra: 啊,我相信DPI 标志可能只在 Apache 2.2 中添加,所以如果你运行的是早期版本,它会导致内部服务器错误,因为它没有认识国旗。
  • 是的,我使用的是 Apache 2.0.63 附带的 MAMP Pro。关于为什么更具体的正则表达式模式会导致如此奇怪的结果的任何解释?我对普通的PCRE相当熟悉,想不出任何解释。
  • @lococobra:哦,我之前回复的时候没有看到你评论的第二部分,哎呀。本质上,您有相同的场景,其中部分 URL 被视为 PATH_INFO,然后重新附加到您的替换结果中。正则表达式工作正常,但它们仅用于匹配输入。替换替换整个 URL,而不仅仅是匹配的模式。您可以尝试设置AcceptPathInfo Off 看看它是否有任何区别,但我必须仔细检查为什么在这种情况下首先得到它。
  • 我尝试将路径完全更改为仅由随机字符组成的路径,并按照您的建议添加 AcceptPathInfo Off 。两者都没有以任何方式改变结果。我明白你所说的关于替换整个 url.. 但是仍然没有解释为什么 url 的任何部分被重新添加。
猜你喜欢
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-08
  • 1970-01-01
  • 2014-12-10
相关资源
最近更新 更多