如何在apache中基于域重写URL并添加额外的参数?

时间:2009-07-27 08:44:57

标签: apache mod-rewrite

基本上,我想要做的是重写所有网址,因为我们有许多不同的语言。我们有一台托管多个域的服务器。我们有www.example.com,www.example.fr,www.example.de,www.anotherdomain.com,www.anotherdomain.de。我想要做的是使用额外的url参数lang = en将所有来自example.xxx的请求重定向到www.example.com。这不应该影响其他领域,如www.anotherexample.com等。

这不起作用:

RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.de$
RewriteRule ^(.*)$   http://www.example.com/$1?lang=de [PT]
RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.fr$
RewriteRule ^(.*)$   http://www.example.com/$1?lang=fr [PT]

使事情变得更加困难的一件事是ServerName与主机名完全不同,它被称为prod.migr.com。

任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:0)

试试这个:

RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.de$
RewriteRule ^  http://www.example.com%{REQUEST_URI}?lang=de [L,R=301,QSA]
RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.fr$
RewriteRule ^  http://www.example.com%{REQUEST_URI}?lang=fr [L,R=301,QSA]

答案 1 :(得分:0)

PT标志很可能是您的问题。当目标是一个完整的域地址时,我从未见过它,因为它意味着URI会被mod_alias进一步重定向。

您应该使用的标志是QSA标志,以防用户访问的页面上有查询字符串。

RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.de$
RewriteRule ^(.*)$   http://www.example.com/$1?lang=de [QSA]
RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.fr$
RewriteRule ^(.*)$   http://www.example.com/$1?lang=fr [QSA]

然而,更好的解决方案是检查用户正在使用服务器端语言(如php或asp)访问的主机,如果所有语言都托管在同一服务器上。

编辑以回复其他信息:

你不能通过重写到不同的域来获取POST变量,因为它必须重定向请求。

最好的办法是确定服务器端语言的语言,而不是使用mod_rewrite。

如果你使用php就像这样

$lang = substr(strrchr($_SERVER['HTTP_HOST'], '.'), 1);

其他语言有类似的方法来确定主机。