Apache HTTPS 到 HTTPS 重定向
Posted
技术标签:
【中文标题】Apache HTTPS 到 HTTPS 重定向【英文标题】:Apache HTTPS to HTTPS Redirection 【发布时间】:2011-08-18 12:01:00 【问题描述】:我们有一个客户端服务器使用 RHEL 中的 Apache 2.2 和 Tomcat 6 托管我们的 Web 应用程序。我已经为 http 到 https 重定向设置了 apache 重写规则,它工作正常。我们有两个 DNS 名称用于访问同一个应用程序。 Test1.com 和 Test2.com。我希望所有尝试访问 http://test1.com 或 https://test1.com 到 https://test2.com 的用户。如前所述,http://test1.com 到 https://test2.com 的重定向工作正常。我无法实现https://test1.com 到https://test2.com。
我尝试过 Virtual Hosts、ServerAlias、NameVirtualHost,但没有任何效果。如果我们可以通过重写来处理这个问题,任何建议都会有所帮助。任何其他可能导致此问题解决的指针将不胜感激。
谢谢
【问题讨论】:
您目前如何将http://test1.com
重定向到https://test2.com
?
我正在使用 Rewrite 规则如下: RewriteEngine On RewriteCond %HTTPS off RewriteRule ^(.*)$ https://test2.com$1 [R=301]
【参考方案1】:
我通过 MULTIPLE 重定向解决了这个问题,与 @A Kunin 的回答不同。
因为我为两个站点使用不同的证书,如果我只是从httpS://test1.com
重定向到httpS://test2.com
,它会报告证书错误。
我的解决方案是:httpS://test1.com
--> http://test1.com
--> httpS://test2.com
<VirtualHost *:80>
ServerName test1.com
Redirect "/" "https://test2.com/"
</VirtualHost>
<VirtualHost *:443>
ServerName test1.com
#### The Tricky ####
Redirect "/" "http://test2.com/"
SSLEngine on
# SSLProxyEngine On
SSLCertificateFile /path/site1.crt
SSLCertificateKeyFile /path/site1.key
SSLCertificateChainFile /path/DigiCertCA1.crt
SSLProtocol ALL -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
</VirtualHost>
<VirtualHost *:443>
ServerName test2.com
...
SSLEngine on
# SSLProxyEngine On
SSLCertificateFile /path/site2.crt
SSLCertificateKeyFile /path/site2.key
SSLCertificateChainFile /path/DigiCertCA2.crt
SSLProtocol ALL -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
</VirtualHost>
【讨论】:
中间的步骤完全没用,它只会破坏加密的请求。最糟糕的是,用户甚至没有注意到他的连接没有一步加密。【参考方案2】:我有带有 https(证书)的 site1 和带有 http(没有证书)的 site2,两者都在同一个 IP(虚拟主机。 然后我注意到站点 2 被 Google 错误地索引为 https,使用站点 1 的内容。
同时用于 RewriteCond 监听
对于端口 80,重定向需要 坐在 site2 的 .htaccess 中, 对于端口 443,重定向需要 坐在 site1 的 .htaccess 中。但随后区分不再通过端口,而是通过 HTTP_HOST(DNS 名称)。
对我来说,site1 = shop.smartgart.com,site2 = one0.com。 我把它放到了site1的.htaccess中:
RewriteEngine On
RewriteCond %HTTP_HOST !^shop.smartgart.com$
RewriteRule ^(.*)$ https://shop.smartgart.com/$1 [R=301,L]
即:如果正在处理的 HTTP_HOST 不是 site1,则使用提供的后缀 ($1) 重定向到 site1。
为我工作!
【讨论】:
【参考方案3】:我通过重定向解决了这个问题,但我必须使用所有必要的 ssl 设置为 https 重定向设置虚拟主机。
<VirtualHost *:80>
ServerName test1.com
Redirect "/" "https://test2.com/"
</VirtualHost>
<VirtualHost *:443>
ServerName test1.com
Redirect "/" "https://test2.com/"
SSLEngine on
# SSLProxyEngine On
SSLCertificateFile /path/site.crt
SSLCertificateKeyFile /path/site.key
SSLCertificateChainFile /path/DigiCertCA.crt
SSLProtocol ALL -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
</VirtualHost>
<VirtualHost *:443>
ServerName test2.com
...
SSLEngine on
# SSLProxyEngine On
SSLCertificateFile /path/site.crt
SSLCertificateKeyFile /path/site.key
SSLCertificateChainFile /path/DigiCertCA.crt
SSLProtocol ALL -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
</VirtualHost>
【讨论】:
请将此答案标记为真。它绝对有效。 这是正确答案。在我看来,如果没有有效证书,您就无法使用简单的 Apache 为两个站点重定向 https 虽然我同意这是真的,但它并不适用于所有情况。就我而言,我们不再使用site2.com,并希望将任何合法流量重定向到site1.com。我们不想为了重定向工作而维护site2.com 的证书。【参考方案4】:尝试以下方法:
RewriteEngine On
RewriteCond %HTTP_HOST test1.com$
RewriteRule ^(.*)$ https://test2.com$1 [L,NC,R=301]
如果<VirualHost>
和:80
和:443
都有<VirualHost>
,则此重定向应适用于两种配置。
【讨论】:
感谢您的建议,但没有奏效。我们有第二个域的 ssl 证书,但没有第一个域。所以当我使用 https 访问第一个域时,它会引发安全警告。我想重定向到第二个域,无论是 http 还是 https。 @Noman Amir:这是不可能的,因为重定向是在 HTTP 层上完成的,而 SSL 在下面的层上工作。因此,在执行重定向之前,SSL 层必须已建立连接 - 这会导致安全警告。 @Robert:虽然令人失望,但非常感谢您提供的信息!有没有可能在收到安全警告后重定向?以上是关于Apache HTTPS 到 HTTPS 重定向的主要内容,如果未能解决你的问题,请参考以下文章
apache重定向到https和TP5的隐藏index重定向
为特定的 url 设置从 http 到 https 的 apache 重定向