尽管有[L]选项,重写规则给出了无限循环(错误500)

时间:2017-03-08 22:08:26

标签: .htaccess mod-rewrite

我必须使用各种类型的网址。第一个包含数字,第二个包含数字,例如:

/forms/my-forms/form/123/edit
/forms/my-forms/

我想从路径中取出所有数字(如果他们在/之前/之后没有字母,例如123但不是a123)到$_GET变量和另一个$_GET的路径的其余部分,所以我会在重写后得到类似的东西:

index.php?path=forms/my-forms/form/edit&id=123
index.php?path=forms/my-forms/

我为此创建了.htaccess

Options +FollowSymLinks -MultiViews
RewriteEngine On

RewriteBase /

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond $1 !^(index\.php|robots\.txt)

RewriteRule ^(.*)/([0-9]+)(.*)?$ ./index.php?path=$1$3&id=$2 [L]
RewriteRule ^(.*)$ ./index.php?path=$1 [L]

但它给了我不定式循环(500 Interla Server Error),尽管两个规则都使用[L]

当我删除其中一条规则时,另一条规则正常(但当然我只处理第一种或第二种类型的网址)。

2 个答案:

答案 0 :(得分:2)

L旗不会做你认为它做的事。 L只存在当前的重写周期并发送uri用于下一个处理。由于您的上一条规则,您将收到重写循环错误

 RewriteRule ^(.*)$ ./index.php?url=$1 [L]

对于您的示例,这会将所有内容重写为 /index.php 在第一次迭代中 http://example.com/foobar被重写为 /index.php?url=foobar ,然后,在第二次重写迭代 /index.php?url=foobar 被重写为自身 /index.php?url = 因此apache会向客户端返回500错误状态。 要修复循环错误,您需要告诉mod-rewrite在第一次迭代中退出规则处理,如果您使用的是apache 2.4,则可以将 L 替换为 END ,如果如果您使用的是较低版本的apache,则可以在导致内部循环的规则之上使用以下条件

RewriteCond %{ENV_REDIRECT_STATUS} !200

答案 1 :(得分:2)

尝试使用以下规则,我现在没有尝试过,但.*是导致问题的原因它匹配url中的所有内容,之后大多数规则停止工作而不是{{1} }。

.*