我有一个有3种语言的多语言网站,我正在使用以下规则将请求重定向到基于浏览器接受语言的网站的正确版本。
#swedish
RewriteCond %{HTTP:Accept-Language} ^sv.*$ [NC]
RewriteCond %{REQUEST_URI} ^/$ [NC]
RewriteCond %{QUERY_STRING} !(^q\=) [NC]
RewriteRule ^(.*)$ /sv [L,R=301]
#norwegian bokmal
RewriteCond %{HTTP:Accept-Language} ^nb.*$ [NC]
RewriteCond %{REQUEST_URI} ^/$ [NC]
RewriteCond %{QUERY_STRING} !(^q\=) [NC]
RewriteRule ^(.*)$ /nb [L,R=301]
#norwegian
RewriteCond %{HTTP:Accept-Language} ^no.*$ [NC]
RewriteCond %{REQUEST_URI} ^/$ [NC]
RewriteCond %{QUERY_STRING} !(^q\=) [NC]
RewriteRule ^(.*)$ /nb [L,R=301]
#all others go to english
RewriteCond %{REQUEST_URI} ^/$ [NC]
RewriteCond %{QUERY_STRING} !(^q\=) [NC]
RewriteRule ^(.*)$ /en [L,R=301]
我需要升级此规则以执行保留子域的相同重定向
Example for a norwegian request:
www.domain.com/subdomain -> www.domain.com/nb/subdomain
我怎样才能实现这个目标?
我感谢@faa帮助我解决现行规则。
答案 0 :(得分:1)
关于评论中的页面与子域名问题,在此特定情况下无关紧要。事实上,您问题中的传入网址是: www.domain.com/subdomain
,除了名称,/subdomain
显然是一个页面。
真正的子域确实是属于另一个域的域,并且保存它的URL格式类似于subdomain.domain.com
,因此我没有混淆。< / p>
不清楚的是,如何处理重定向。根据你的问题,但是用整个路径替换“子域”,这里有一些例子:
www.domain.com/
应该转到www.domain.com/LangCode/
,(之前的工作重定向)
www.domain.com/page
应转到www.domain.com/LangCode/page
www.domain.com/page1/page2/page3/etc/
应该转到www.domain.com/LangCode/page1/page2/page3/etc
。这种可能性不在问题中,但最终可能会被解决。
在这些情况下,传入和重定向的URL中的页面应该具有相同的名称,但是,尽管在传入的URL中不一定存在,但是在重定向的URL中,页面必须存在,因此加载默认脚本(索引)例如.php或index.html来处理请求。
这意味着每个页面中都必须有一个脚本需要重定向。我会说每种语言至少2个。
据我所知,这就是问题和补充意见所表明的内容,但似乎这不是一种实用的方法。
更好的方法可以是处理所有请求的根文件夹中的单个脚本。这个想法可以用例子更好地描述:
www.domain.com/
始终显示在浏览器的地址栏中,但内部显示
www.domain.com/lang_handler.php?lang=sv
或
www.domain.com/page1/
始终显示在浏览器的地址栏中,但内部显示在www.domain.com/lang_handler.php?lang=sv&target_page1=page1
这可以通过mod_rewrite指令在.htaccess中实现。这是一个例子:
RewriteEngine On
RewriteBase /
# Set managed languages here, except default (en)
RewriteCond %{HTTP:Accept-Language} ^(sv|ne|no).*$ [NC]
# Replace the names of the script and the parameters in the next 2 lines
RewriteCond %{REQUEST_URI} !lang_handler\.php [NC]
RewriteRule ^([^/]+)?/?$ lang_handler.php?lang=%1&target_page1=$1 [L,QSA]
# If no match, set English
# Replace the names of the script and the parameters in the next 2 lines
RewriteCond %{REQUEST_URI} !lang_handler\.php [NC]
RewriteRule ^([^/]+)?/?$ lang_handler.php?lang=en&target_page1=$1 [L,QSA]
上述规则集静默地映射
http://www.domain.com/
或http://www.domain.com/page1
要
http://www.domain.com/lang_handler.php?lang=LangCode&target_page1=page1
LangCode
默认为sv
ne
no
或en
。
此示例仅适用于1页或无页面。虽然可以处理任意数量的页面,但必须相应地修改规则。必须将更多参数和正则表达式组添加到RewriteRules中。
答案 1 :(得分:0)
$ 1应该可以解决问题。
RewriteCond %{HTTP:Accept-Language} ^no.*$ [NC]
RewriteCond %{REQUEST_URI} ^/$ [NC]
RewriteCond %{QUERY_STRING} !(^q\=) [NC]
RewriteRule ^(.*)$ /nb/$1 [L,R=301]