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

.htaccess 重写规则给出了有限循环(错误500),尽管有[L]选项,.htaccess,mod-rewrite,.htaccess,Mod Rewrite,我必须选择不同类型的URL。第一个包含数字,第二个不包含,例如: /forms/my-forms/form/123/edit /forms/my-forms/ 我想把路径中的所有数字(如果它们在/符号之前/之后没有字母,例如123,但不是a123)去掉到$\u GET变量,然后把路径的其余部分去掉到另一个$\u GET,这样我在重写之后会得到类似的结果: index.php?path=forms/my-forms/form/edit&id=123 index.php?path=form

我必须选择不同类型的URL。第一个包含数字,第二个不包含,例如:

/forms/my-forms/form/123/edit
/forms/my-forms/
我想把路径中的所有数字(如果它们在
/
符号之前/之后没有字母,例如
123
,但不是
a123
)去掉到
$\u GET
变量,然后把路径的其余部分去掉到另一个
$\u 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服务器错误),尽管这两个规则都使用了
[L]


当我删除其中一条规则时,另一条规则可以正常工作(但当然我只处理第一类或第二类URL)。

L flag并不像您想象的那样。L只是存在于当前的重写周期中,并为下一阶段的处理发送uri。由于上一条规则,您将出现重写循环错误

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

RewriteCond %{ENV_REDIRECT_STATUS} !200

L flag并不像你想象的那样。L只是存在于当前的重写周期中,并为下一阶段的处理发送uri。由于上一条规则,您将出现重写循环错误

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

RewriteCond %{ENV_REDIRECT_STATUS} !200

尝试使用下面的规则,我暂时没有尝试,但是
*
是导致问题的原因,它匹配url中的所有内容,之后大多数规则停止工作,而不是使用
*

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

尝试使用下面的规则,我暂时没有尝试,但是
*
是导致问题的原因,它匹配url中的所有内容,之后大多数规则停止工作,而不是使用
*

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