在下面的代码中,正则表达式做了什么?
RewriteCond %{REQUEST_URI} ^/(?:[A-Za-z]+(?:/[A-Za-z]*)*)(?:/\d+)?$
RewriteRule .* var/www/%1/index.php [L]
重新规则的结果是什么?
谢谢,我正在帮朋友修复旧的CMS,我不知道为什么要这样做。
答案 0 :(得分:2)
应该将表单/letters{/letters}[/digits]
的所有请求重定向到本地文件var/www/SOMETHING/index.php
,但它不会:首先,没有捕获组(所有组都有前导?:
和因此,不清楚SOMETHING
将是什么。接下来,var/www...
部分应该具有前导/
。
答案 1 :(得分:2)
重写规则的结果是什么?
AFAIK当你不期望它时会产生404s。为什么呢?
(?:something)括号与()基本相同,只是它们没有设置匹配变量。由于所有包围都是这样的%1
永远不会被定义。
挑选亚历山大的描述/letters{/letters}([/digits])
,其中/digits
是可选的。重复组是“零个或多个字母”,因此将使用任何 /
字符,这些是贪婪的匹配,因此/aa/bb/cc/123
将被解析为(/aa
})(/bb
)(/cc
)(/
)(123
)。这将失败,因为 123 与(?:/\d+)?
因此它只匹配alpha路径字符串,例如/ aaa / bbb / ccc和%1将为“”,在这些情况下,这将相对于当前路径重定向到var/www//index.php
,这可能是DOCROOT,因此除非DOCROOT/var/www/index.php
存在,否则结果是404。
答案 2 :(得分:0)
在mod-rewrite help之后,%1
应该引用上一个RewriteCond的正则表达式的第一个捕获组。 但正则表达式只有非捕获组...