如何使用重写apache重定向/到相关的语言文件夹

时间:2015-08-23 21:24:54

标签: regex .htaccess rewrite

基本上我有.htaccess文件包含以下行;

i_mapping

我想基于cookie

将/目录重定向到相关语言文件夹

如果Cookie设置为

#1 / to /en|fr
RewriteCond %{HTTP_COOKIE} lang=([^;]+) [NC]
RewriteRule !^((?!(?:fr|en)).+?)$ /%1/$1 [L,R=301]

#2 add trailing slash /en to /en/ & /fr to /fr/
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([en|fr]{2})$ /$1/ [R=301,L]

#3 /en/[index] & /fr/[index]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([en|fr]{2})/$ $2?lang=$1 [L,QSA]

它应该以

结束
lang=fr 

如果cookie设置为

/fr/

它应该以

结束
lang=en

所以我不想留在/en/ 目录。一旦我使用规则#1,即使页面重定向到/ en /或/ fr /,我也会得到空页面。规则#2和规则#3效果很好。任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

#2 add trailing slash /en to /en/ & /fr to /fr/
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([en|fr]{2})$ /$1/ [R=301,L]

虽然这可能只是工作,但这不是匹配/en/fr的正确模式。您匹配en|fr字符类中的字符)中的任意两个字符)。相反,这应该是:

RewriteRule ^(en|fr)$ /$1/ [R=301,L]

与规则#3类似的问题:

#3 /en/[index] & /fr/[index]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([en|fr]{2})/$ $2?lang=$1 [L,QSA]

此模式中没有$2反向引用。它看起来应该是这样的:

RewriteRule ^(en|fr)/(.*)$ /$2?lang=$1 [L,QSA]

请注意,我还为替换添加了斜杠前缀。