无尽的重定向循环通过htaccess的规则多国语言 [英] Endless Redirect Loop by htaccess rules multi language
问题描述
我不以书面形式modrewrite访问规则好,想实现以下情形:
虚拟URL /en/shop.php重定向到/shop.php?lang=en
已经得到了这一点,但实际问题是modrewrite环境中:
如果url为/(空) - >重定向到/ EN /(/index.php?lang=en)
如果url为/ EN'或'/德 - >重定向到/ EN /或/德/(加斜杠)
如果URI是定义像/en/shop.php - >重定向到/shop.php?lang=en
我已经尝试了几种规则,但最后一个导致死循环,我无法弄清楚什么是错的..:/请帮助
这是我的.htaccess文件:
RewriteEngine叙述上
的RewriteBase /
#空网址 - >重定向到EN /
重写规则^ $ EN / [R = 301,L]
#网址是唯一的'/ EN'或'/德 - >重定向到/ EN /或/德/(加斜杠)
重写规则^(ZH | DE)$ $ 1 / [R = 301,L]
#现在所有的URL都设有/德/ - >解析它们
重写规则^(ZH | DE)/ $ $ 2 1 LANG = $&AMP(*);?%{QUERY_STRING} [R = 301,L]
这是导致重定向环行:
重写规则^(ZH | DE)/ $ 1 $ 2 LANG = $&AMP(*);?%{QUERY_STRING} [R = 301,L]
由于它是将浏览器重定向到 /?LANG = EN
(例如)。然后第一个规则:
重写规则^ $ EN / [R = 301,L]
重定向到 / EN /?LANG = EN
,那么最后一条规则重定向到 /?LANG = EN
,那么第一个规则,等等。
您可能是指过去的规则是内部的,另外,你的第一个规则需要检查是否有已经是一个查询字符串参数,郎:
RewriteEngine叙述上
的RewriteBase /
#空网址 - >重定向到EN /
的RewriteCond%{QUERY_STRING} LANG =(ZH | DE)!
重写规则^ $ EN / [R = 301,L]
#网址是唯一的'/ EN'或'/德 - >重定向到/ EN /或/德/(加斜杠)
重写规则^(ZH | DE)$ $ 1 / [R = 301,L]
#现在所有的URL都设有/德/ - >解析它们
?重写规则^(ZH | DE)/(。*)$ 1 $ 2 LANG = $&放大器;%{QUERY_STRING} [L]
#没有R = 301在这里-------------------------------------- ^
i'm not good in writing modrewrite access rules and would like to achieve the following scenario:
virtual url /en/shop.php redirects to /shop.php?lang=en
already got that but the actual problems are within the modrewrite environment:
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
i've tried several rules but the last one results in a endless loop and i can't figure out what's wrong .. :/ please help
here's my .htaccess file:
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]
This is the line that is causing the redirect loop:
RewriteRule ^(en|de)/(.*)$ $2?lang=$1&%{query_STRING} [R=301,L]
Because it is redirecting the browser to /?lang=en
(for example). Then the first rule:
RewriteRule ^$ en/ [R=301,L]
Redirects it to /en/?lang=en
, then the last rule redirects it to /?lang=en
, then the first rule, etc.
You probably meant the last rule to be internal, additionally, your first rule needs to check if there's already a query string parameter, "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 --------------------------------------^
这篇关于无尽的重定向循环通过htaccess的规则多国语言的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!