【问题标题】:.htaccess language subdomain redirect.htaccess 语言子域重定向
【发布时间】:2021-07-30 20:08:07
【问题描述】:

我正在尝试将我的语言变量 domain.com?lang=X 重定向到子域 X.domain.com

我有这个代码:

RewriteCond %{QUERY_STRING} (^|&)lang=(es|de|fi|tr)
RewriteRule ^(.*)$ https://%2.domain.com%{REQUEST_URI} [R=301,L]

很遗憾,当我想通过转到 domain.com/page?lang=es 更改语言时,我被重定向到 es.domain.com/page?lang=es 导致循环。

所以我尝试在 URL 的末尾添加一个问号,如下所示:

RewriteRule ^(.*)$ https://%2.domain.com%{REQUEST_URI}? [R=301,L]

防止它在子域访问时添加 ?lang= 变量,但在这种情况下,语言不会改变,我最终得到 es.domain.com/page 英文。

在过去的 4 个小时里,我一直在挖掘 StackOverflow 和其他网站,试图找到解决方案,但无济于事。如何检测到我已经被重定向到子域,然后在实际更改语言时忽略 ?lang= 变量?

请帮忙。

谢谢。

【问题讨论】:

    标签: .htaccess redirect mod-rewrite url-rewriting query-string


    【解决方案1】:

    为此,您需要 2 条规则:

    RewriteEngine On
    
    # external redirect rule using THE_REQUEST variable
    RewriteCond %{HTTP_HOST} ^domain\.com$ [NC]
    RewriteCond %{THE_REQUEST} \s/+([^?]*)\?&?lang=(es|de|fi|tr)\s [NC]
    RewriteRule ^ https://%2.domain.com/%1? [NE,R=301,L]
    
    # internal rewrite rule to add lang parameter back
    RewriteCond %{QUERY_STRING} !(^|&)lang= [NC]
    RewriteCond %{HTTP_HOST} ^(es|de|fi|tr)\. [NC]
    RewriteRule ^ %{REQUEST_URI}?lang=%1 [L,QSA]
    

    【讨论】:

    • 添加 lang 参数的最后一条规则会导致循环,因为我最终得到 es.domain.com/page?lang=es 子域和 ?lang= 都相互重定向。
    • 它只适用于主页,例如 es.domain.com。如果我去 es.domain.com/1/2,它会循环为 es.domain.com/1/2?lang=es
    • 我收到 es.domain.com/1/2?lang=es 的 21 个 301 重定向
    • 完全清除浏览器缓存后,您能否尝试我的更新答案。
    【解决方案2】:

    您能否尝试遵循 htaccess 文件顶部的 .htaccess 规则。 请确保在测试您的 URL 之前清除您的浏览器缓存。

    RewriteEngine ON
    ##use THE_REQUEST variable to match condition here, with NC flag.
    RewriteCond %{THE_REQUEST} \s/([^?]*)\?&?lang=(es|de|fi|tr)\s [NC]
    RewriteRule ^ https://%2.domain.com%1 [NE,R=301,L]
    

    【讨论】:

      猜你喜欢
      • 2012-05-09
      • 1970-01-01
      • 1970-01-01
      • 2012-03-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 2012-04-21
      相关资源
      最近更新 更多