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

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

问题描述

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

虚拟网址/en/shop.php 重定向到/shop.php?lang=en

已经知道了,但实际问题出在 modrewrite 环境中:

如果 url 是 '/' (空) -->重定向到/en/(/index.php?lang=en)如果 url 是 '/en' 或 '/de' -->重定向到/en/或/de/(添加斜杠)如果 uri 是定义的",如/en/shop.php ->重定向到/shop.php?lang=en

我尝试了几种规则,但最后一个导致无限循环,我无法弄清楚出了什么问题..:/请帮忙

这是我的 .htaccess 文件:

RewriteEngine On重写基数/# 空网址 ->重定向到 en/重写规则 ^$ en/[R=301,L]# url 仅为 '/en' 或 '/de' ->重定向到/en/或/de/(添加斜杠)重写规则 ^(en|de)$ $1/[R=301,L]# 现在所有的 url 都有 en/de/->解析它们重写规则 ^(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重写基数/# 空网址 ->重定向到 en/RewriteCond %{QUERY_STRING} !lang=(en|de)重写规则 ^$ en/[R=301,L]# url 仅为 '/en' 或 '/de' ->重定向到/en/或/de/(添加斜杠)重写规则 ^(en|de)$ $1/[R=301,L]# 现在所有的 url 都有 en/de/->解析它们重写规则 ^(en|de)/(.*)$ $2?lang=$1&%{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天全站免登陆