.htaccess 重写语言子域

Posted

技术标签:

【中文标题】.htaccess 重写语言子域【英文标题】:.htaccess rewrite for language subdomains 【发布时间】:2012-03-20 19:41:58 【问题描述】:

我需要在我的网站上配置子域以获得多语言支持。 我可以设置域以供本地使用,指向一个文件夹,但我的主机不允许我将它们指向我的应用所在的主根目录

/public/es/public/www/index.php

es.domain.com需要指向/public/www/index.php

我什至不能在 /es/ 文件夹中使用符号链接。

他们回复了我

对于您的托管包,我们建议您使用 .htaccess 和 mod_rewrite 工具。 您可以在子目录中放置一个 .htaccess 文件,以将 es.domain.com URL 重写为 domain.com/es/anything_else

这样访问者或搜索引擎仍然会看到

es.domain.com/anything 作为地址。

我试过这是 /es/ 文件夹,但得到了 403

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^es.domain.com/?$   ^domain.com/es_ES?$ [L,R=301]   
</IfModule>

编辑我的网站设置为使用es.domain.com 子域更改语言。

【问题讨论】:

我已阅读您的问题,但我不明白。如果我错了,请纠正我。你有es.domain.com 并且你希望所有对它的请求都重定向到domain.com?对吗? 嗨,不,不重定向,重写。我的主机不允许我将子域映射到 www 文件夹中的主应用程序。 对不起,我的意思是重写:-)。那么,例如http://es.domain.com/index.php 转到http://domain.com/es_ES/index.php?对吗? es.domain.com 需要指向/public/www/index.php 我的应用程序从子域端口找出语言 /public/www/index.php 主域的文档根目录吗? 【参考方案1】:

这是您可能想要做的,以便将来能够处理许多子语言。

检查您的主机:如果它以es 开头,则更改您的文档根目录。 这是提示:

RewriteCond %HTTP_HOST ^es\.mydomain\.com$
# Change the path:
RewriteRule ^/?$ /public/www/index.php

现在您可能会想到一些更高级的东西:同一网站的多语言。

RewriteCond %HTTP_HOST ^(us|fr|pt)\.mydomain\.com$
# Create an environment variable to remember the language:
RewriteRule (.*) - [QSA,E=LANGUAGE:%1]

# Now check if the LANGUAGE is empty (= doesn't) exists
RewriteCond %ENV:LANGUAGE ^$
# If so, create the default language (=es):
RewriteRule (.*) - [QSA,E=LANGUAGE:es]

好的,现在我们有一个设置语言的环境变量。

你要求这个:

es.domain.com需要指向/public/www/index.php

所以添加这条最终规则:

RewriteCond %ENV:LANGUAGE ^es$
# Change the root folder:
RewriteRule ^/?$ /public/www/index.php

总而言之:

RewriteCond %HTTP_HOST ^(us|fr|pt)\.mydomain\.com$
# Create an environment variable to remember the language:
RewriteRule (.*) - [QSA,E=LANGUAGE:%1]
# Now check if the LANGUAGE is empty (= doesn't exist)
RewriteCond %ENV:LANGUAGE ^$
# If so, create the default language (=es):
RewriteRule (.*) - [QSA,E=LANGUAGE:es]
# Change the root folder of the spanish language:
RewriteCond %ENV:LANGUAGE ^es$
# Change the root folder:
RewriteRule ^/?$ /public/www/index.php

我不明白的是:你为什么不能只为所有语言编写一次,然后编写如下内容:

RewriteCond %HTTP_HOST ^(us|fr|pt)\.mydomain\.com$
# Create an environment variable to remember the language:
RewriteRule (.*) - [QSA,E=LANGUAGE:%1]
# Now check if the LANGUAGE is empty (= doesn't exist)
RewriteCond %ENV:LANGUAGE ^$
# If so, create the default language (=es):
RewriteRule (.*) - [QSA,E=LANGUAGE:es]

# WHATEVER THE LANGUAGE ADD IT TO THE URI:
RewriteRule (.*) $1?language=%ENV:LANGUAGE [QSA]

所以现在想象一下有人打字:

http://es.mydomain.com/ http://us.mydomain.com/ http://fr.mydomain.com/ http://pt.mydomain.com/

所有都指向同一段代码,您只需在Php 文件中处理它:查看$_GET['language'] 变量并阅读好“翻译”文件。

这只是一个建议,可帮助您减少工作,让非常健壮应用程序!


希望这会有所帮助!


[编辑 1]

这是您可以放入 .htaccess 文件的最后内容:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %HTTP_HOST ^(us|fr|pt)\.mydomain\.com$
    RewriteRule (.*) - [QSA,E=LANGUAGE:%1]
    RewriteCond %ENV:LANGUAGE ^$
    RewriteRule (.*) - [QSA,E=LANGUAGE:es]
    RewriteRule (.*) $1?language=%ENV:LANGUAGE [QSA]
</IfModule>

[编辑 2]

我的最新规则是这样的:

Original URL => where it goes http://pt.domain.com/ =&gt; http://pt.domain.com/?language=es http://pt.domain.com/aa.php =&gt; http://pt.domain.com/aa.php?language=es http://es.domain.com/ =&gt; http://es.domain.com/?language=es http://es.domain.com/aa.php =&gt; http://es.domain.com/aa.php?language=es http://domain.com/ =&gt; http://domain.com/?language=es http://domain.com/bb.php =&gt; http://domain.com/bb.php?language=es

根本不会改变路径

这个改变路径:

RewriteCond %HTTP_HOST ^(us|fr|pt)\.mydomain\.com$
RewriteRule (.*) - [QSA,E=LANGUAGE:%1]
RewriteCond %ENV:LANGUAGE ^$
RewriteRule (.*) - [QSA,E=LANGUAGE:es]
RewriteCond %ENV:LANGUAGE ^es$
RewriteRule ^/?$ /public/www/index.php

所以这应该给出:

Original URL => where it goes http://pt.domain.com/ =&gt; http://pt.domain.com/ http://pt.domain.com/aa.php =&gt; http://pt.domain.com/aa.php http://es.domain.com/ =&gt; /public/www/index.php http://es.domain.com/aa.php =&gt; http://es.domain.com/aa.php http://domain.com/ =&gt; /public/www/index.php http://domain.com/bb.php =&gt; http://domain.com/bb.php

【讨论】:

哇,谢谢 Oliver :-) 我明天去看看。这些规则进入子文件夹对吗?对于每种语言。您的最后一个代码块是放在我的应用所在的 /www/ 文件夹中,对吧? 我已经编辑了我的答案,以便您在最后获得完整的重写规则,您只需将其复制/粘贴到您的 .htaccess 文件中。 您好,我刚刚检查过,但我收到了 403,禁止访问。我还想注意,我将我的 CMS 更新到了一个可以通过子域计算本地化的版本,因此不再需要链接到 domain.com/es_ES/es.domain.com 应该只指向 /public/www/index.php 当我尝试你的第一个代码块 RewriteCond %HTTP_HOST ^(us|fr|pt|es)\.mydomain\.com$ RewriteRule (.*) - [QSA,E=LANGUAGE:%1] RewriteCond %ENV:LANGUAGE !^$ RewriteRule (.*) - [QSA,E=LANGUAGE:es] RewriteCond %ENV:LANGUAGE ^es$ RewriteRule ^/?$ /public/www/index.php 时,我得到一个 404,未找到 您确定/public/www/index.php 存在吗?【参考方案2】:

试试这个

Options +FollowSymlinks
RewriteEngine On
RewriteBase /

RewriteCond %HTTP_HOST ^es\.
RewriteCond %REQUEST_URI !^/es
RewriteRule ^(.*)$   http://domain.com/es_ES/$1 [P,L]

【讨论】:

感谢您的回复,但我收到 404“在此服务器上未找到请求的 URL /es_ES/。”我需要访问 mydomain.com/es_ES/ 另外,当我尝试 RewriteRule ^(.*)$ /albums/$1 [L] 时,我得到一个 500 - domain.com/albums/ 是我的 /public/www/ 目录中的有效 URL 对不起。我假设子域在同一个虚拟主机中。我错过了你问题中的那一部分。我在上面编辑了我的解决方案! 格本,非常感谢您的帮助。不幸的是它还没有工作..我得到一个 404。即使我这样做 RewriteRule ^(.*)$ http://domain.com/$1 [P,L] 我得到一个 400“您的浏览器发送了一个该服务器无法理解的请求。请求标头字段的大小超出了服务器限制。”

以上是关于.htaccess 重写语言子域的主要内容,如果未能解决你的问题,请参考以下文章

.htaccess 将子域重写到目录并将子域保留在 url

.htaccess 将子域重写到目录

子域“m”。与 WordPress 和。 htaccess(在 htaccess 中的重写规则冲突。)

htaccess 子域重写规则

使用基于浏览器语言的 htaccess 从和到子域重定向

.htaccess 问题、虚拟子域和 Codeigniter