这个不重定向的简单重写规则有什么问题?

时间:2018-10-07 12:42:24

标签: regex .htaccess url-rewriting

大家好,

我正在努力尝试理解这个行不通的简单规则出了什么问题。 我有一个具有以下URL的网站:site.com/support,我现在想将所有URL都重定向到site.com/en、site.com/support/到site.com/en/support/, ....

经过多次尝试和搜索,我提出了以下2条规则:

RewriteRule ^(?![a-z]{2}/)(.*)$ /en/$1 [R=301,L] # redirect to default language
RewriteRule ^([a-z]{2})/(.*)$ /$2?lang=$1 [QSA,L]

这些规则中的每一个都可以完美地分开工作,但是合并时会导致重定向过多(?lang = en&lang = en&lang = en ...)

任何人都可以告诉我,怎么了?

谢谢

1 个答案:

答案 0 :(得分:1)

问题在于,两个规则都在修改REQUEST_URI并导致彼此重复执行,直到浏览器检测到重定向循环并由于错误而停止重定向。

您可以使用以下方法修复它:

RewriteEngine On

# redirect to default language
RewriteCond %{ENV:REDIRECT_STATUS} !200
RewriteRule ^(?![a-z]{2}/)(.*)$ /en/$1 [R=301,L,NE]

RewriteRule ^([a-z]{2})/(.*)$ /$2?lang=$1 [QSA,L]

RewriteCond %{ENV:REDIRECT_STATUS} !200条件将防止重定向循环,因为Apache将在第一次成功执行第一个规则后将REDIRECT_STATUS env变量设置为200