Apache / mod_rewrite:更改TLD,但保留子域,协议和查询字符串

时间:2014-03-10 17:05:52

标签: apache mod-rewrite redirect vhosts tld

我彻底搜索了stackoverflow,发现了大约100个mod_rewrite-questions,但是这个没有被覆盖......奇怪,因为它看起来很常见。

我的问题:我在主域(mywebapp.com)上有一个网络应用程序。现在我还有其他特定国家/地区的TLD(例如.ch),我想在.com域重定向。到目前为止没什么特别的。但现在到了其他标准:

要求

  • 协议应保持不变
  • 查询字符串应保持不变
  • 子域名部分应保持不变,因为租户由那些
  • 标识
  • 只交换TLD!

实施例

所以要把它们放在一起的例子:

  • http:// demo.mywebapp.ch - > http:// demo.mywebapp.com
  • http:// other.mywebapp.ch/user/profile - > http:// other.mywebapp.com/user/profile
  • https:// third.mywebapp.ch/about - > https:// third.mywebapp.com/about

(url中的空格是故意阻止stackoverflow生成链接)

等等。我真的只需要以协议通用的方式替换TLD。如果规则集符合SEO(301),那当然会很好。

其他信息/详细信息

域名目前设置为指向我具有root访问权限的同一个Web服务器/ IP。服务器由ISPConfig管理,但我也可以手动编辑虚拟主机。

提前谢谢!

欢呼声, 帕斯卡

3 个答案:

答案 0 :(得分:2)

我遇到了这个脚本的问题。
例如,它可以正常工作,如:
domain.net => domain.com
domain.net/something => domain.com/something

但是当我尝试使用子域名和不同的顶级域名时,会发生这种情况 sub.domain.org => subdomain.com
但是 sub.domain.com => sub.domain.com

所以我更改了代码,这是我的版本工作:

RewriteCond %{HTTP_HOST} !.*\.com
RewriteCond %{HTTPS} ^on
RewriteCond %{HTTP_HOST} (?:([^.]+\.))?mywebapp\..*
RewriteRule ^.* https://%1mywebapp.com%{REQUEST_URI} [R=302,L]

RewriteCond %{HTTP_HOST} !.*\.com
RewriteCond %{HTTPS} !^on
RewriteCond %{HTTP_HOST} (?:([^.]+\.))?mywebapp\..*
RewriteRule ^.* http://%1mywebapp.com%{REQUEST_URI} [R=302,L]

希望这有助于某人, RT-2

P.S。我会在当前的答案中添加我的评论,但是由于某种原因,我说我没有足够的声誉。

答案 1 :(得分:0)

我认为以下方法可以解决问题:

RewriteEngine on
RewriteBase /

RewriteCond %{HTTP_HOST} !.*\.com
RewriteCond %{HTTPS} ^on
RewriteCond %{HTTP_HOST} (?:([^.]+)\.)?mywebapp\..*
RewriteRule ^.* https://%1mywebapp.com%{REQUEST_URI} [R=302,L] #removed double slash

RewriteCond %{HTTP_HOST} !.*\.com
RewriteCond %{HTTPS} !^on
RewriteCond %{HTTP_HOST} (?:([^.]+)\.)?mywebapp\..*
RewriteRule ^.* http://%1mywebapp.com%{REQUEST_URI} [R=302,L] #removed double slash

这就是它的意思:

  1. 仅当 RewriteRule不包含 .com
  2. 时才创建%{HTTP_HOST}
  3. 检查协议,只有在https
  4. 时才会继续
  5. 运行正则表达式以检查子域是否存在并存储子域(如果存在)(由$1引用)
  6. 手动强制.com,在其前面加上子域名,连接%{REQUEST_URI},然后重定向(我将其保留为302 Temporary Redirect,以便您可以根据需要使用它。我会去到301,直到你100%准备好了)
  7. 编辑:我复制了规则集来处理协议问题。所以显然你只能得到最后一个反向引用。这意味着当协议是https时,它将覆盖存储在%1反向引用中的子域。通过为任一协议设置规则集,您可以避免该问题。可能不是最漂亮的方式,但它应该完成工作。

答案 2 :(得分:0)

我的问题没有什么不同,但我的印象是RewriteRule导致协议从https切换到http,即使我的canonicalname为on。 当LTM正在执行SSL卸载时,为我做这个技巧的属性是 RequestHeader set ClientProtocol https

Listen 8085
<VirtualHost *:8085>
UseCanonicalName On
ServerName https://vip-name
ProxyPreserveHost On
RequestHeader set ClientProtocol https 
RewriteEngine On
#RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !^/abc$ 
RewriteCond %{REQUEST_URI} ^/xyz$
RewriteRule ^ - [skip=1]
RewriteRule ^/xyz$  https://vip-name/xyz/bc/gui/xyz/language=EN$1 [R,L]
RewriteRule ^/xyz(.*) http://ip1:8085$0 [P,NC]
RewriteRule ^/(.*) http://ip2:8086$0 [P,NC]
</VirtualHost>