.htaccess htaccess规则多语言无限重定向循环

.htaccess htaccess规则多语言无限重定向循环,.htaccess,mod-rewrite,.htaccess,Mod Rewrite,我不擅长编写modrewrite访问规则,希望实现以下场景: 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

我不擅长编写modrewrite访问规则,希望实现以下场景:

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
我尝试了好几条规则,但最后一条规则会导致无休止的循环,我无法找出问题出在哪里请帮忙

这是我的.htaccess文件:

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]

这是导致重定向循环的行:

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 --------------------------------------^