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

编程入门 行业动态 更新时间:2024-10-21 12:47:34
本文介绍了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 规则多语言的无限重定向循环

本文发布于:2023-11-01 18:16:57,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1550058.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:多语言   重定向   规则   htaccess

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!