0

我有以下代码:

RewriteRule ^(feedback|contact)/? /contact-us\.php?ct=$1 [L]

这是返回INTERNET SERVER ERROR,为什么?

但是当我删除时|contact,它可以工作。

工作代码:

RewriteRule ^(feedback)/? /contact-us\.php?ct=$1 [L]

为什么它有效,而早期则无效?

4

2 回答 2

2

它导致 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从而防止无限循环。

于 2013-03-09T07:43:33.017 回答
0

你可以试试:

^(feedback|contact).*? /contact-us\.php?ct=$1 [L]

这将匹配两个选择。

于 2013-03-08T21:30:03.350 回答