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]

如果&lt;VirualHost&gt;:80:443 都有&lt;VirualHost&gt;,则此重定向应适用于两种配置。

【讨论】:

感谢您的建议,但没有奏效。我们有第二个域的 ssl 证书,但没有第一个域。所以当我使用 https 访问第一个域时,它会引发安全警告。我想重定向到第二个域,无论是 http 还是 https。 @Noman Amir:这是不可能的,因为重定向是在 HTTP 层上完成的,而 SSL 在下面的层上工作。因此,在执行重定向之前,SSL 层必须已建立连接 - 这会导致安全警告。 @Robert:虽然令人失望,但非常感谢您提供的信息!有没有可能在收到安全警告后重定向?

以上是关于Apache HTTPS 到 HTTPS 重定向的主要内容,如果未能解决你的问题,请参考以下文章

Apache:使用通配符永久重定向到 HTTPS

apache重定向到https和TP5的隐藏index重定向

apache https 正在重定向到 http

为特定的 url 设置从 http 到 https 的 apache 重定向

从 Apache VirtualHost 将 HTTPS 永久重定向到 HTTP

apache_conf 重定向到HTTPS