2013-07-04 76 views
1

我不以书面形式modrewrite访问规则好,想实现以下情形:无限重定向循环通过htaccess的规则多语言

virtual url /en/shop.php redirects to /shop.php?lang=en 

已经得到了,但实际的问题是modrewrite环境中:

if url is '/' (empty)  --> redirect to /en/ (/index.php?lang=en) 
if url is '/en' or '/de' --> redirect to /en/ or /de/ (add slash) 
if an uri is "defined" like /en/shop.php -> redirect to /shop.php?lang=en 

我已经尝试了几种规则,但在一个无限循环的最后一个结果,我无法弄清楚什么是错的..:/请帮助

这里是我的.HT访问的文件:

RewriteEngine On 
RewriteBase/ 

# empty url -> redirect to en/ 
RewriteRule ^$ en/ [R=301,L] 

# url is ONLY '/en' or '/de' -> redirect to /en/ or /de/ (adding slash) 
RewriteRule ^(en|de)$ $1/ [R=301,L] 

# now all urls have en/ de/ -> parse them 
RewriteRule ^(en|de)/(.*)$ $2?lang=$1&%{query_STRING} [R=301,L] 
+0

导致无限循环的规则是什么? –

回答

2

这是引起该重定向循环的行:

RewriteRule ^(en|de)/(.*)$ $2?lang=$1&%{query_STRING} [R=301,L] 

由于是将浏览器重定向至/?lang=en(例如)。然后第一个规则:

RewriteRule ^$ en/ [R=301,L] 

它重定向到/en/?lang=en,那么最后一个规则其重定向到/?lang=en,那么第一个规则等

你可能是指过去的规则是内部的,另外,您第一条规则需要检查是否已有查询字符串参数“lang”:

RewriteEngine On 
RewriteBase/ 

# empty url -> redirect to en/ 
RewriteCond %{QUERY_STRING} !lang=(en|de) 
RewriteRule ^$ en/ [R=301,L] 

# url is ONLY '/en' or '/de' -> redirect to /en/ or /de/ (adding slash) 
RewriteRule ^(en|de)$ $1/ [R=301,L] 

# now all urls have en/ de/ -> parse them 
RewriteRule ^(en|de)/(.*)$ $2?lang=$1&%{query_STRING} [L] 
# no "R=301" here --------------------------------------^