为什么“RewriteRule(。*)”失败,而RewriteRule。*有效?

时间:2013-04-16 04:08:46

标签: regex apache .htaccess mod-rewrite

我已将此.htaccess放在我的根文件夹中:

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule   (.*) public/$1    [L]
 </IfModule>

它会导致500内部服务器错误而无需解释。

如果我删除了它的作用:

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule   .* public/$1    [L]
 </IfModule>

为什么呢? Aren的禁忌在这里应该是中立的吗?

我使用的是最新的XAMPP版本(Windows)。

3 个答案:

答案 0 :(得分:1)

正则表达式组用圆括号括起来,在这种情况下,表达式.*匹配所有内容,因此始终使用规则。

使用括号中的表达式,规则映射到public/WhateverIsInsideParenthesis,因为$1是对组1的后引用:(.*)。在这种情况下唯一的一个。

如果没有括号,规则只会映射到public/,因为没有组。括号内没有任何内容。

您没有提供请求的示例,而是提供类似的内容:

http://example.com/folder1/folder2/script1/括号内的URI路径为folder1/folder2/script1/和替换网址:

http://example.com/public/folder1/folder2/script1/

因此,在这种情况下出现错误有几个原因,有或没有括号。规则映射到的请求,循环等等都可能生成该错误。 500内部服务器错误是用于出错的一般HTTP status code

答案 1 :(得分:0)

如果将起始字符^放入?

会怎样?
<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteRule   ^(.*) public/$1    [L]
</IfModule>

答案 2 :(得分:0)

是的,对于模式,括号是中性的。

但是当你在替换中使用捕获的字符串$1时,它们会有所不同。然后该规则等同于

RewriteRule (.*) public/$1

RewriteRule .* public/

当您遗漏括号并将$1替换为$0

RewriteRule .* public/$0

然后再次出现相同的错误,这次没有括号。