使用子域和子目录进行htaccess本地化

时间:2014-09-11 08:31:36

标签: apache .htaccess mod-rewrite

基本上我在为可通过此示例解释的场景构建强大的重写规则时遇到了问题:

我有一个适用于3个不同子域的网站:

http://www.domain.tld
http://subdom1.domain.tld
http://subdom2.domain.tld

现在,我被要求添加本地化功能。主要语言是IT,应添加EN语言。 我想要实现的是这样的网址结构:

http://www.domain.tld   => maps to IT homepage
http://www.domain.tld/en/    => maps to EN homepage
http://subdom1.domain.tld/en    => maps to EN homepage of subdom1

或者,从技术角度讲,我想实现这个url结构:

http://(whatever).domain.tld/whatever.*   => maps to the IT representation
http://(whatever).domain.tld/en/whatever.*  => maps to the EN representation

网站上的每个页面都会通过一个独特的页面构建器,所以我不想触摸其他160行htaccess来映射每个页面的/ en /表示。

我在stackoverflow中看到的一个非常好的选择是使用ENV变量,并且经过一小段复制/粘贴/ mod后我创建了这一段重写,但不幸的是它没有工作,它报告每个页面的404 not found错误:

# if an url matches the /en/whatever, the ENV LANGUAGE gets set to EN
RewriteCond %{REQUEST_URI} ^en/(.*)$
    RewriteRule (.*) - [QSA,E=LANGUAGE:en]
# if no ENV variable is present yet, let's default it to IT
RewriteCond %{ENV:LANGUAGE} ^$
    RewriteRule (.*) - [QSA,E=LANGUAGE:it]
# rewrite whatever url with the ENV variable posted via GET
RewriteRule (.*) $1?language=%{ENV:LANGUAGE} [QSA]

现在,我觉得这个问题是最后一个RewriteRule,我想这还不足以让这个技巧发挥作用。 是否对htaccess发布了任何建议或更正?

1 个答案:

答案 0 :(得分:0)

过了一段时间,注意到通过htaccess处理这种类型的本地化需要太多时间来重建和修改IT htaccess规则,我选择了htaccess / php混合技术。 将添加到网站的每种语言都有自己的子目录,例如" en"用于英语本地化和" fr"为法国人

http://www.domain.tld        => maps to IT homepage
http://www.domain.tld/en/    => maps to EN homepage
http://www.domain.tld/fr/    => maps to FR homepage

我所做的是在IT网站的根目录上创建一个PHYSICAL文件夹,其中包含所有htaccess规则,并创建一个" url preparser"在该文件夹中:对/ en /或/ fr /本地域进行的每个请求都将通过一个php文件(每个本地化语言都有):

  1. 了解什么网址被叫,什么"模块" (购物车,搜索页面等)
  2. 如果子域名不匹配,则重新分析和301重定向
  3. 创建一个"正常"的功能变量。 htaccess将传递给页面构建器
  4. 包含IT网站的页面构建器,定义我们处于本地化领域(en,fr等)
  5. 这样,总会有一个单一的页面构建器可以用于网站的每个页面,并且只有在定义了本地化变量时它才会处理本地化