我有以下代码:
RewriteRule ^(feedback|contact)/? /contact-us\.php?ct=$1 [L]
这是返回INTERNET SERVER ERROR,为什么?
但是当我删除时|contact
,它可以工作。
工作代码:
RewriteRule ^(feedback)/? /contact-us\.php?ct=$1 [L]
为什么它有效,而早期则无效?
我有以下代码:
RewriteRule ^(feedback|contact)/? /contact-us\.php?ct=$1 [L]
这是返回INTERNET SERVER ERROR,为什么?
但是当我删除时|contact
,它可以工作。
工作代码:
RewriteRule ^(feedback)/? /contact-us\.php?ct=$1 [L]
为什么它有效,而早期则无效?
它导致 URI 的无限循环(代码 500)的原因如下:/contact/
因为您在 RewriteRule 中匹配以下正则表达式:
^(feedback|contact)/?
然后您在内部将匹配的 URI 转发到:
/contact-us.php?ct=contact
您可以看到将再次匹配您的正则表达式:^(feedback|contact)/?
并且您的规则将再次重定向到/contact-us.php?ct=contact
. 这种匹配和转发将继续进行,直到达到 Rewrite Limit 并且 Apache 抛出错误。
为避免这种循环,您应该使用以下规则:
RewriteRule ^(feedback|contact)(/.*|)$ /contact-us.php?ct=$1 [L,QSA,NC]
上述规则将匹配以下 URI:
/contact
/contact/
/contact/foo
/contact/foo/bar
...
但它不会匹配URI:/contact-us.php
从而防止无限循环。
你可以试试:
^(feedback|contact).*? /contact-us\.php?ct=$1 [L]
这将匹配两个选择。