我彻底搜索了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
它是这么说的:
- 仅当
%{HTTP_HOST}
不包含.com 创建 - 检查协议并只在https 时继续
- 运行正则表达式检查子域是否存在,如果存在则存储子域(由
$1
引用) - 手动强制
.com
,前面有子域,连接%{REQUEST_URI}
,然后重定向(我把它作为302 Temporary Redirect
,所以你可以根据需要玩它。我会切换到301
,直到你100%准备好)
RewriteRule
%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>