我刚刚翻译了我的网站。出于搜索引擎优化的原因(为了避免重复的内容),我希望每个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解决了这个问题!他的解决方案很完美。 所以,我编辑了我的问题,使其对访问者更有帮助。
答案 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]