.htaccess重定向基于路径

时间:2014-04-19 13:59:41

标签: apache .htaccess mod-rewrite redirect

我需要对.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/ru/faq"如果用户点击链接" domain.com/faq"。

1 个答案:

答案 0 :(得分:0)

对于第一部分,您要使用内部重写。对于第二部分,您需要使用外部重定向。要使第二部分起作用,您可能想要使用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,则还需要重定向。如果网址尚未包含语言标识符,我们只需要重定向。

#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,如果且仅当所有内容都按预期工作时。