我有以下代码:
RewriteRule ^(feedback|contact)/? /contact-us\.php?ct=$1 [L]
返回 INTERNET SERVER ERROR ,为什么?
但是当我删除|contact
时,它就可以了。
工作代码:
RewriteRule ^(feedback)/? /contact-us\.php?ct=$1 [L]
为什么它有效,而早先没有?
答案 0 :(得分:2)
为什么它会导致像/contact/
这样的URI的无限循环(代码500),因为你在RewriteRule中匹配以下正则表达式:
^(feedback|contact)/?
然后你在内部将匹配的URI转发到:
/contact-us.php?ct=contact
您可以看到的内容将再次与您的正则表达式匹配:^(feedback|contact)/?
,您的规则将再次重定向到/contact-us.php?ct=contact
。这个匹配&转发将继续,直到达到重写限制并且Apache抛出错误。
要避免此循环,您应使用以下规则:
RewriteRule ^(feedback|contact)(/.*|)$ /contact-us.php?ct=$1 [L,QSA,NC]
以上规则将匹配以下URI:
/contact
/contact/
/contact/foo
/contact/foo/bar
...
但它将不匹配 URI:/contact-us.php
,从而阻止了无限循环。
答案 1 :(得分:0)
您可以尝试:
^(feedback|contact).*? /contact-us\.php?ct=$1 [L]
哪两个选项匹配。