0

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

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

它会导致 500 内部服务器错误,没有任何解释。

如果我删除括号,它会起作用:

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

为什么?paranthesis在这里不应该是中性的吗?

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

4

3 回答 3

1

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

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

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

您没有给出请求的示例,而是针对以下内容:

http://example.com/folder1/folder2/script1/括号内的 URI 路径是folder1/folder2/script1/和替换 URL:

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

因此,在这种情况下,有几个错误的原因,有或没有括号。规则映射到的请求、循环等都可能产生该错误。500 Internal Server Error 一般HTTP status code用于所有出错的地方。

于 2013-04-16T05:34:13.503 回答
0

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

但是,当您在替换中使用捕获的字符串 as 时,它们会有所不同$1。那么这个规则相当于

RewriteRule (.*) public/$1

或者

RewriteRule .* public/

当您省略括号并替换$1$0

RewriteRule .* public/$0

那么你又遇到了同样的错误,这次没有括号。

于 2013-04-16T06:40:34.893 回答
0

如果你把起始字符放进去会发生什么^

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteRule   ^(.*) public/$1    [L]
</IfModule>
于 2013-04-16T04:36:11.707 回答