无尽的重定向循环通过htaccess的规则多国语言 [英] Endless Redirect Loop by htaccess rules multi language

查看:282
本文介绍了无尽的重定向循环通过htaccess的规则多国语言的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我不以书面形式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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆