Apache mod_rewrite接受语言子域重定向

时间:2013-01-17 11:08:05

标签: apache mod-rewrite

我有一个有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帮助我解决现行规则。

2 个答案:

答案 0 :(得分:1)

更新

问题描述

关于评论中的页面与子域名问题,在此特定情况下无关紧要。事实上,您问题中的传入网址是 www.domain.com/subdomain,除了名称,/subdomain显然是一个页面。

真正的子域确实是属于另一个域的域,并且保存它的URL格式类似于subdomain.domain.com,因此我没有混淆。< / p>

不清楚的是,如何处理重定向。根据你的问题,但是用整个路径替换“子域”,这里有一些例子:

  1. www.domain.com/应该转到www.domain.com/LangCode/,(之前的工作重定向)

  2. www.domain.com/page应转到www.domain.com/LangCode/page

  3. www.domain.com/page1/page2/page3/etc/应该转到www.domain.com/LangCode/page1/page2/page3/etc。这种可能性不在问题中,但最终可能会被解决。

  4. 在这些情况下,传入和重定向的URL中的页面应该具有相同的名称,但是,尽管在传入的URL中不一定存在,但是在重定向的URL中,页面必须存在,因此加载默认脚本(索引)例如.php或index.html来处理请求。

    这意味着每个页面中都必须有一个脚本需要重定向。我会说每种语言至少2个。

    据我所知,这就是问题和补充意见所表明的内容,但似乎这不是一种实用的方法。

    建议的解决方案

    更好的方法可以是处理所有请求的根文件夹中的单个脚本。这个想法可以用例子更好地描述:

    1. www.domain.com/始终显示在浏览器的地址栏中,但内部显示 www.domain.com/lang_handler.php?lang=sv

    2. www.domain.com/page1/始终显示在浏览器的地址栏中,但内部显示在www.domain.com/lang_handler.php?lang=sv&target_page1=page1

    3. 这可以通过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 noen

      此示例仅适用于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]