mod rewrite - Apache / mod_rewrite:改变TLD,但保持子域,协议和查询字符串



我彻底搜索了stackoverflow,发现了大约100个mod_rewrite-questions,但这并没有被覆盖…奇怪的是,这似乎很常见。

我的问题:我有一个主域(mywebapp.com)的web应用程序。现在我有额外的国家特定的顶级域名(例如。ch),我想在。com域名上重定向。到目前为止没什么特别的。现在来看看其他标准:

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

所以把它们放在一起,一些例子应该如何:

  • http://demo.mywebapp.com -> 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)就好了。

附加信息/详细信息

域目前被设置为指向相同的web服务器/IP,我有根访问。服务器由ISPConfig管理,但我也可以手动编辑vhost。

已经提前感谢了!

欢呼,帕斯卡

这个脚本有问题。
例如,它可以正常工作,如:
Domain.net => domain.com
Domain.net/something => domain.com/something

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

sub.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

注:我本想把我的评论添加到当前的答案中,但它说由于某种原因,我的声誉不够。

我想下面的方法可以达到目的:

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

我的问题有点不同,但我的印象是RewriteRule导致协议从https切换到http,即使我有canonicalname作为on。 requesttheader set ClientProtocol https,当LTM正在做SSL卸载时。

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>

最新更新