我不擅长编写 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=enalready 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=eni'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 规则多语言的无限重定向循环
发布评论