如何将HTTPS重定向到HTTP?


166

如何将HTTPS重定向到HTTP?也就是说,每个人(貌似)所教的相反。

我在HTTPS上有一台服务器,为此我支付了SSL认证,还有一台我没有为其镜像的镜像,并且只为紧急情况而保留,因此它不值得获得证书。

在客户的桌面上,我有一些指向http://production_serverhttps://production_server(都可以)的快捷方式。但是,我知道,如果我的生产服务器出现故障,则DNS转发开始,那些捷径上带有“ https”的客户端将盯着https://mirror_server它(不起作用),并且Internet Explorer 7出现一个很大的红屏为我的公司。

不幸的是,我不能仅仅在客户端级别上进行切换。这些用户非常会文盲:并且很可能不愿意看到HTTPS“不安全”错误(尤其是当今Firefox 3和Internet Explorer 7的处理方式:FULL STOP,谢天谢地,但在这里没有帮助我)。

这是很容易 找到 的Apache的解决方案基于HTTP> HTTPS重定向,但对我的生活,我不能反其道而行之。

有想法吗?


2
不要那样做 !从HTTP重定向到HTTPS极其危险(实际上,由于滥用,所有浏览器都会立即对其进行阻止),尤其是如果这是通过静默HTTP状态进行的节点(但如果是通过javascript完成的话,则同样如此),除非以下任一情况:- (1)有一个短暂的HTTPS停车页面,邀请用户通过主动单击该链接来使链接失效;或:-(2)HTTPS完全在相同的域上重定向到HTTP ,并且重定向不会更改请求的内容类型。在浏览器中允许它允许许多恶意软件通过隔离。此类重定向非常具有欺骗性。
verdy_p

4
这看起来像一个内部站点,OP知道那里发生了什么,因此并不危险。如果这是一台面向Web的服务器,我会同意你的看法,但是内部的,仅限本地的Web服务器是一个重定向这种方式不会成为问题。
斯蒂斯

@verdy_p在强制门户的情况下,我正在使用HTTPS到HTTP 302重定向。您能指出我要参考的文档吗?
jprusakova '19

对于您的强制门户网站,请不要执行任何HTTPS到HTTP 302重定向,除非这是完全相同的域(甚至不是子域)。而且由于信息泄露的风险很高,请注意会话令牌和cookie,它们是通过重定向透明传递的!您应该知道可以对HTTP目标进行调整,并且可以由恶意软件透明代理甚至通过恶意DNS来获取信息:您的客户Mayu甚至都不知道您仅HTTP的目标将是无法到达的,并且实际上会变成黑帽!因此,永远不要在包含私有会话/ cookie /请求的HTTPS链接上执行此操作。
verdy_p

此类HTTPS 302重定向始终是HTTPS站点中的安全漏洞。巨大的风险是会话被盗,而经过身份验证的用户的私人帐户也被收获了。在所有情况下,都永远不要进行此类重定向以加载JavaScript或活动的多媒体:这是HTTPS“沙盒”领域的门户。真正考虑做相反的事情:将HTTP重定向到HTTPS(特别是您的主门户网站或不需要私有数据/会话/ cookie的静态公共页面),并使用HTTPS来实现其他目的。如果您需要从HTTPS到HTTP,请使用标准链接(在不同的请求中)
verdy_p

Answers:


128

这尚未测试,但我认为应该使用mod_rewrite

RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}

1
如何使它起作用(为了使此代码起作用,我必须从该代码更改为我的域)吗?
2013年

1
Enve:只需添加到站点的vhost_ssl.conf配置(或站点根目录中的.htaccess)。无需更改,它将动态使用相同的主机名和url路径。
达伦·费尔顿

1
我认为您可能还想捕获查询字符串。我不确定,但是我认为上面的代码片段不会将查询字符串从https转发到http。
Rustavore

12
如下面的Kieron所指出的,如果镜像服务器没有有效的证书,则此操作将无效。由于证书无效,您仍然会看到一个红色的大警告。一旦开始使用https,您基本上就会陷入困境。准备为您一生付出的代价。如果您停止付款,添加了https链接标记的人将无法通过。
Stephen Cheng

2
付出余生?您仍然可以使用HTTPS,但可以更改PKI提供程序并获得新的廉价证书。您仍然需要支付一些费用,但是您的域名和托管服务也是如此!与域名相比,PKI证书现在已经不算昂贵,与托管/带宽成本相比,它是微不足道的!
verdy_p

71

请记住,重写引擎仅在收到HTTP请求后才启动-这意味着您仍将需要证书,以便客户端建立连接以将请求发送过来!

但是,如果备份计算机似乎具有相同的主机名(就客户端而言),那么就没有理由不能使用与主生产计算机相同的证书。


1
如何克服这一限制?我有相同的问题。在重定向之前从浏览器获取证书错误。
Sandeep Balagopal

如果有证书错误,最好重定向回HTTP
长颈鹿杰弗里(Jeffrey the Giraffe)

首先,这完全挫败了使用HTTPS的目的
FluffyBeing

12

根据ejunker的回答,这是适用于我的解决方案,而不是在单个服务器上,而是在环境中

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{ENV:HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

使用301几乎没有危险。301表示已永久删除,我认为从https转到http是暂时的。看到这个接受的答案的利弊是什么,为用户stackoverflow.com/questions/1393280/...
优素福tezel

301/302永久/临时区别仅与搜索引擎有关。
matthewv789

9

对于那些正在使用.conf文件的用户。

<VirtualHost *:443>
    ServerName domain.com
    RewriteEngine On
    RewriteCond %{HTTPS} on
    RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}

    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/domain.crt
    SSLCertificateKeyFile /etc/apache2/ssl/domain.key
    SSLCACertificateFile /etc/apache2/ssl/domain.crt

</VirtualHost>

8

如果以上解决方案都不对您有用(对我而言不起作用),那么这是在我的服务器上起作用的:

RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [L,R=301]

6
通常,您不希望使用L,(这表示“最后规则”)。如果您使用的是wordpress或其他CMS,则该L标志可能会阻止正确路由页面请求。RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301]
改为

5

当我使用cloudflare时,以上所有方法均无效,这对我有用:

RewriteCond %{HTTP:X-Forwarded-Proto} =https
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

并且这个绝对可以在没有代理的情况下工作:

RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

3

最好避免使用mod_rewrite。

在您的情况下,我将用以下内容替换Rewrite:

    <If "%{HTTPS} == 'on'" >
            Redirect permanent / http://production_server/
    </If>

根据<If>博客的此处,该指令仅在Apache 2.4+中可用。


在托管环境中,一个可以查看使用Apache的版本/usr/sbin/httpd -v
塞尔Stroobandt

1

这对我有用。

<VirtualHost *:443>
    ServerName www.example.com
    # ... SSL configuration goes here
    Redirect "https://www.example.com/" "http://www.example.com/"
</VirtualHost>

<VirtualHost *:80>
    ServerName www.example.com
    # ... 
</VirtualHost>

确保同时监听端口80和443。


0

在Wordpress网站上,没有一个答案对我有用,但随后的工作(与其他答案相似,但有少许变化)

RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

请勿对所有REQUEST_URI盲目使用此类规则(如果URI中包含任何表单数据,或请求元数据中包含cookie /会话ID,则不应使用此规则)。仅将其用于静态公共页面/图像。对于javascript或活动组件(尤其是可脚本编写的视频流或活动PDF,除非您进行了数字签名,否则请完全避免使用它!仍然无法对javascript进行数字签名,仅将它们保留在您的安全域中)。
verdy_p

注意:某些图像格式是有效的并且可以编写脚本:例如,请注意SVG。我们已经看到一些HTTPS网站受到攻击,这些网站从HTTP加载SVG图像(具有站点302重定向),并受到恶意软件的攻击,这些恶意软件在SVG内容中插入了脚本。安全限制也应适用,即使它使用相同的域名...)也是如此,因此“ http://(域)/ ...”和“ https://(域)/”将被视为不同的域即使CORS位于相同的TCP端口号上,它也不会起源。
verdy_p

@verdy_p,“使用站点的302重定向”到底是什么意思?您必须首先拥有服务器站点(或TCP / IP级别的参与者节点,例如DNS服务器,路由器),才能利用这些HTTP资源请求,对吗?
Sz。

不必要。域上的HTTPS将是安全的,而同一域上的HTTP将不是安全的(即使使用DNSSEC,漏洞也不需要控制IP或路由器或DNS服务器;漏洞仅可以使用IP欺骗,如果没有HTTPS,则无法安全地检测到。安全会话)。因此,我坚持认为HTTPS站点必须通过不通过HTTP提供图像来托管图像(即使在同一域中)(在某些需要激活单击或掩盖不安全图像的浏览器中,默认情况下甚至拒绝该图像)。必须禁止HTTPS / HTTP混合使用:网站的HTTP部分(例如,跟踪像素)容易受到攻击。
verdy_p

-6

据我所知,简单的元刷新也可以正常工作而不会引起错误:

<meta http-equiv="refresh" content="0;URL='http://www.yourdomain.com/path'">

12
我希望要求不赞成投票的人发表评论,解释不赞成投票的原因。就个人而言,除非您作为开发人员无权访问要为其开发的服务器,但您确实有权访问该页面,否则我不会选择此答案。一个问题是,您必须对每个页面上的每个路径进行硬编码才能使其正常工作。如果可以假定针对重要用例启用了JavaScript,那么最好使用JavaScript更改为http。上面的答案比较好,因为它们发生在服务器上,因此不需要JavaScript。
Rustavore

2
简而言之:因为htaccess比这更好。此外,如果您没有证书,也不会解决将https协议重定向到http的问题。
midudev

1
该操作应由服务器处理,而不是由服务器处理。
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.