我必须使用各种类型的网址。第一个包含数字,第二个包含数字,例如:
/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]
。
当我删除其中一条规则时,另一条规则正常(但当然我只处理第一种或第二种类型的网址)。
答案 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} }。
.*