【问题标题】:Endless Redirect Loop by htaccess rules multi language通过 htaccess 规则多语言进行无休止的重定向循环
【发布时间】:2013-07-02 17:00:14
【问题描述】:

我不擅长写modrewrite访问规则,想实现如下场景:

virtual url /en/shop.php redirects to /shop.php?lang=en

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

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

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

这是我的 .htaccess 文件:

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]

【问题讨论】:

  • 什么是导致死循环的规则?

标签: .htaccess mod-rewrite


【解决方案1】:

这是导致重定向循环的行:

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
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 --------------------------------------^

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 2011-02-16
    • 2019-09-16
    • 1970-01-01
    • 2013-09-29
    相关资源
    最近更新 更多