.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/ => http://pt.domain.com/?language=es
http://pt.domain.com/aa.php => http://pt.domain.com/aa.php?language=es
http://es.domain.com/ => http://es.domain.com/?language=es
http://es.domain.com/aa.php => http://es.domain.com/aa.php?language=es
http://domain.com/ => http://domain.com/?language=es
http://domain.com/bb.php => 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/ => http://pt.domain.com/
http://pt.domain.com/aa.php => http://pt.domain.com/aa.php
http://es.domain.com/ => /public/www/index.php
http://es.domain.com/aa.php => http://es.domain.com/aa.php
http://domain.com/ => /public/www/index.php
http://domain.com/bb.php => 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 重写语言子域的主要内容,如果未能解决你的问题,请参考以下文章