强制URL中的语言。如果URL没有语言,则根据浏览器语言重定向

时间:2013-12-13 19:19:31

标签: regex apache .htaccess mod-rewrite redirect

我刚刚翻译了我的网站。出于搜索引擎优化的原因(为了避免重复的内容),我希望每个URL都包含其中的语言。例如,www.racebooking.net/page.php必须变为www.racebooking.net/en/page.php。然后,/en/部分将转换为?lang=en

此外,用户在浏览网站时必须能够选择首选语言。

我试图实现的逻辑如下:

  • 如果网址为racebooking.net/en/page.html,只需转到 page.html?lang=en无论我的浏览器是哪种语言
  • 如果网址为racebooking.net/it/page.html,只需转到 page.html?lang=it无论我的浏览器是哪种语言
  • 如果网址为racebooking.net/page.html,请检查浏览器语言。如果 意大利语,将网址转换为racebooking.net/it/page.html然后转 到page.html?lang=it,在任何其他情况下将网址转换为 racebooking.net/en/page.html并转到page.html?lang=en

我写了这个htaccess

RewriteCond %{THE_REQUEST} !^[A-Z]{3,}\s/[en|it]{1,1}/(.*)$ [NC]
RewriteCond %{HTTP:Accept-Language} ^it [NC]
RewriteRule ^$ /it/%1 [L,QSA,NC]

RewriteCond %{THE_REQUEST} !^[A-Z]{3,}\s/[en|it]{1,1}/(.*)$ [NC]
RewriteRule ^$ /en/%1 [L,QSA,NC]

但是没有发生任何事情......它没有检测到/en//it/丢失了!看起来第一个RewriteCond没有发生......

此外,它似乎与此规则发生冲突

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

任何想法?

修改 经过长时间的讨论,@ anubhava解决了这个问题!他的解决方案很完美。 所以,我编辑了我的问题,使其对访问者更有帮助。

1 个答案:

答案 0 :(得分:2)

你的正则表达式是错误的。这部分[en|it]基本匹配字母e, n, | , i, t,因为它是一个字符类。

请尝试以下规则:

DirectoryIndex index.php

RewriteEngine on

# always www
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

# remove index.php from URL
RewriteCond %{THE_REQUEST} /index\.php [NC]
RewriteRule ^(.*?)index\.php$ /$1 [L,R=301,NC,NE]

# redirect first visitors basing on their language or redirect if language not specified
# in URL. If italian, redirect to italian
# if lang is Italian use it
RewriteCond %{THE_REQUEST} !\s/(it|en)/ [NC]
RewriteCond %{HTTP:Accept-Language} ^it [NC]
RewriteRule ^ /it%{REQUEST_URI} [L,NC,R=301]

# otherwise use English
RewriteCond %{THE_REQUEST} !\s/(it|en)/ [NC]
RewriteRule ^ /en%{REQUEST_URI} [L,NC,R=301]

# populate ?lang query parameter
RewriteRule ^(en|it)/(.*)$ $2?lang=$1 [L,QSA,NC]