【问题标题】:.htaccess redirection based on path.htaccess 基于路径的重定向
【发布时间】:2014-04-19 13:59:40
【问题描述】:

我需要对与路径和重定向相关的 .htaccess 文件进行一些小改动。 我将在一个网站上使用不同的语言,例如:

domain.com/fr - 法国网站 domain.com/ru - 俄罗斯网站

和网站上的页面,例如: domain.com/fr/contact domain.com/ru/contact

服务器上不会直接有子,如“fr”或“ru”,而是我想定义.htaccess文件中支持的所有语言,这样如果用户在浏览器中访问如下页面:

“domain.com/fr/contact”

然后.htaccess 规则将指向脚本:

domain.com/translate.pl?fr/contact

translate.pl 将显示正确的语言/页面,但仍显示在浏览器原始页面“domain.com/fr/contact”中。

如果用户在浏览器中访问,例如:domain.com/fr/contact 并点击另一个页面,如“domain.com/faq”,htaccess 将保持相同的语言。如果用户在“ru”站点上,那么如果用户单击链接“domain.com/faq”,它将显示“domain.com/ru/faq”。

【问题讨论】:

    标签: apache .htaccess mod-rewrite redirect


    【解决方案1】:

    对于您想要使用内部重写的第一部分。对于第二部分,您需要使用外部重定向。要让第二部分工作,您可能需要使用 cookie:

    第一部分很简单。如果 url 已经包含一种语言,我们在内部将其重写为 translate.pl。除此之外,我们使用当前语言设置了一个 cookie。有关 CO 标志的更多信息,请参阅 the documentation。如果您可以使用查询字符串调用原始 url,则可能需要使用 QSA 标志。

    #Internal redirect
    RewriteRule ^(fr|ru)/(.*)$ /translate.pl?$1/$2 [L,CO=lang:$1:127.0.0.1:1000:/:0:1]
    

    第二部分可能有点棘手。如果设置了 cookie,则需要重定向用户,但如果未设置 cookie,则还需要重定向。如果 url 还没有包含语言标识符,我们只需要重定向。

    #Redirect if we know the previous language
    RewriteCond %{THE_REQUEST} !^(GET|POST)\ /(ru|fr)/
    RewriteCond %{HTTP_COOKIE} lang=(ru|fr)
    RewriteRule ^(.*)$ /%1/$1 [R,L]
    
    #Redirect if we don't know the previous language
    RewriteCond %{THE_REQUEST} !^(GET|POST)\ /(ru|fr)/
    RewriteCond %{HTTP_COOKIE} !lang=(ru|fr)
    RewriteRule ^(.*)$ /ru/$1 [R,L]
    

    此代码未经测试,但理论上应该可以工作。您显然需要更改 cookie 的域。您还应该确保某个语言页面上的所有链接都包含该语言标识符,以使您的网站更加搜索引擎和用户友好。将上述示例中的 R 标志更改为 R=301 当且仅当一切都按您预期的那样工作。

    【讨论】:

      猜你喜欢
      • 2014-02-12
      • 1970-01-01
      • 2015-04-10
      • 2015-07-21
      • 2012-09-19
      • 1970-01-01
      • 2013-07-18
      • 2012-09-14
      • 1970-01-01
      相关资源
      最近更新 更多