这个正则表达式/重写是做什么的?

时间:2012-02-13 12:24:30

标签: regex apache mod-rewrite

在下面的代码中,正则表达式做了什么?

RewriteCond   %{REQUEST_URI}       ^/(?:[A-Za-z]+(?:/[A-Za-z]*)*)(?:/\d+)?$
RewriteRule   .*                   var/www/%1/index.php [L]

重新规则的结果是什么?

谢谢,我正在帮朋友修复旧的CMS,我不知道为什么要这样做。

3 个答案:

答案 0 :(得分:2)

应该将表单/letters{/letters}[/digits]的所有请求重定向到本地文件var/www/SOMETHING/index.php,但它不会:首先,没有捕获组(所有组都有前导?:和因此,不清楚SOMETHING将是什么。接下来,var/www...部分应该具有前导/

答案 1 :(得分:2)

  

重写规则的结果是什么?

AFAIK当你不期望它时会产生404s。为什么呢?

  1. (?:something)括号与()基本相同,只是它们没有设置匹配变量。由于所有包围都是这样的%1永远不会被定义。

  2. 挑选亚历山大的描述/letters{/letters}([/digits]),其中/digits是可选的。重复组是“零个或多个字母”,因此将使用任何 / 字符,这些是贪婪的匹配,因此/aa/bb/cc/123将被解析为(/aa })(/bb)(/cc)(/)(123)。这将失败,因为 123 (?:/\d+)?

  3. 不匹配
  4. 因此它只匹配alpha路径字符串,例如/ aaa / bbb / ccc和%1将为“”,在这些情况下,这将相对于当前路径重定向到var/www//index.php,这可能是DOCROOT,因此除非DOCROOT/var/www/index.php存在,否则结果是404。

答案 2 :(得分:0)

mod-rewrite help之后,%1应该引用上一个RewriteCond的正则表达式的第一个捕获组。 正则表达式只有非捕获组...