2

我有一个包含 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 帮助我解决当前的规则。

4

2 回答 2

2

更新

问题描述

关于您评论中的页面与子域问题,在这种特定情况下是无关紧要的。事实是您问题中的传入 URL 是: www.domain.com/subdomain并且,除了名称之外,/subdomain显然是一个页面。

一个真正的子域确实是一个域,它是另一个域的一部分,并且包含它的 URL 格式类似于subdomain.domain.com,所以我没有混淆。

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

  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。这种可能性不存在问题,但最终可能需要。

在这些情况下,传入和重定向 URL 中的页面应该具有相同的名称,但是,尽管在传入 URL 中不必存在,但在重定向 URL 中,页面必须存在,因此加载默认脚本(index.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

这可以在 .htaccess 中使用 mod_rewrite 指令来实现。这是一个例子:

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

在哪里或默认情况下LangCodesv ne noen

此示例仅适用于 1 页或无页。虽然可以处理任意数量的页面,但必须相应地修改规则。必须将更多参数和正则表达式组添加到 RewriteRules。

于 2013-01-18T00:18:14.097 回答
0

1美元应该可以解决问题。

RewriteCond %{HTTP:Accept-Language} ^no.*$ [NC]
RewriteCond %{REQUEST_URI} ^/$ [NC]
RewriteCond %{QUERY_STRING} !(^q\=) [NC]
RewriteRule ^(.*)$ /nb/$1 [L,R=301]
于 2013-01-17T11:10:55.233 回答