如何将 HTTPS 重定向到 HTTP?

Posted

技术标签:

【中文标题】如何将 HTTPS 重定向到 HTTP?【英文标题】:How do you redirect HTTPS to HTTP? 【发布时间】:2010-09-05 17:18:20 【问题描述】:

也就是说,与每个人(似乎)教的相反。

我有一个 HTTPS 上的服务器,我为此支付了 SSL 认证,还有一个镜像,我没有,只是为了紧急情况而保留,所以不值得获得认证。

在我客户的桌面上,我有一些指向http://production_serverhttps://production_server 的快捷方式(两者都有效)。但是,我知道如果我的生产服务器出现故障,那么 DNS 转发就会启动,并且那些在快捷方式上有“https”的客户端将盯着https://mirror_server(这不起作用)和一个大胖的 Internet Explorer 7 红色我公司的不安屏幕。

不幸的是,我不能只在客户端级别进行切换。这些用户是非常计算机文盲:并且很可能会因为看到 HTTPS“不安全”错误而吓坏了(尤其是现在 Firefox 3 和 Internet Explorer 7 处理它的方式:完全停止,谢天谢地,但在这里没有帮助我哈哈)。

very easy to find Apache solutions 代表 http->https redirection,但对于我来说,我不能做相反的事情。

想法?

【问题讨论】:

不要那样做!来自 HTTP 的 HTTPS 重定向非常危险(事实上,由于滥用,很快就会被所有浏览器阻止),尤其是如果这是通过静默 HTTP 状态的节点(但如果这是通过 javascript 完成的,情况也是如此),除非:- (1)有一个短暂的HTTPS停放页面,邀请用户通过主动点击链接来浏览它;或: - (2) HTTPS 重定向到完全相同的 SAME 域上的 HTTP,并且重定向不会更改请求的内容类型。在浏览器中允许它允许许多恶意软件通过隔离。这种重定向非常具有欺骗性。 这看起来像一个内部站点,OP 知道它发生了什么,因此并不危险......如果这是一个面向 Web 的服务器,我同意你的看法,但是一个内部站点,本地唯一的网络服务器,这种方式的重定向不会成为问题。 @verdy_p 我正在处理 HTTPS 到 HTTP 302 重定向,即强制门户的情况。您能否指出您所指的文档? 对于您的强制门户,永远不要执行任何 HTTPS 到 HTTP 302 重定向,除非这是完全相同的域(甚至不是子域)。并且由于存在信息泄露的高风险,请注意通过重定向透明传递的会话令牌和 cookie!您应该知道 HTTP 目标可以被调整,恶意软件透明代理甚至恶意 DNS 可以获取信息:您的客户可能甚至不知道您的仅 HTTP 目标将无法访问,并且实际上会进入黑帽!所以永远不要在包含私有会话/cookies/请求的 HTTPS 链接上这样做。 此类 HTTPS 302 重定向始终是您的 HTTPS 站点中的安全漏洞。巨大的风险是会话被盗,您的经过身份验证的用户的私人账户被盗。在所有情况下,永远不要为加载 javascript 或活动多媒体进行此类重定向:这是 HTTPS“沙盒”领域中的一扇敞开的大门。真正考虑做一些相反的事情:将 HTTP 重定向到 HTTPS(特别是您的主门户或不需要私有数据/会话/cookies 的静态公共页面)并使用 HTTPS 进行其他操作。如果您需要从 HTTPS 到 HTTP,请使用标准链接(在不同的请求中) 【参考方案1】:

这还没有经过测试,但我认为这应该使用 mod_rewrite 工作

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

【讨论】:

如何使它工作(我必须从这个代码更改到我的域才能使这个代码工作)? Enve:只需添加到站点的 vhost_ssl.conf 配置(或站点根目录下的 .htaccess)。无需更改任何内容,它将动态使用相同的主机名和 url 路径。 我认为您可能还想捕获查询字符串。我不确定,但我认为上面的 sn-p 不会将查询字符串从 https 转发到 http。 正如下面 Kieron 所指出的,如果镜像服务器没有有效的证书,这将不起作用。由于证书无效,您仍然会看到一个很大的红色警告。一旦你开始使用 https,你基本上就被它困住了。准备好在你的余生中为此付出代价。如果您停止付款,为 https 链接添加书签的人将无法访问。 为你的余生买单?您仍然可以使用 HTTPS,但更改您的 PKI 提供商并获得新的更便宜的证书。是的,您仍然需要支付几美元,但您的域名和托管也是如此! PKI 证书现在与域名相比并不昂贵,与托管/带宽成本相比微不足道!【参考方案2】:

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

但是,如果备用机器看起来具有相同的主机名(就客户端而言),那么您应该没有理由不能使用与主要生产机器相同的证书。

【讨论】:

如何克服这个限制?我有同样的问题。在重定向之前从浏览器获取证书错误。 如果出现证书错误,最好重定向回 HTTP 这完全违背了最初使用 HTTPS 的目的【参考方案3】:

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

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

【讨论】:

使用 301 可能有点危险。 301 意味着永久删除,我想从 https 到 http 是暂时的。请参阅此已接受的答案,了解用户的缺点***.com/questions/1393280/… 301/302 永久/临时区别仅与搜索引擎有关。【参考方案4】:

对于那些使用.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>

【讨论】:

【参考方案5】:

如果上述解决方案都不适合您(它们不适合我),那么这就是在我的服务器上起作用的方法:

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

【讨论】:

很多时候,你不会想要L,(意思是“最后一条规则”)。如果您使用 wordpress 或其他 CMS,L 标志可能会阻止页面请求被正确路由。改为使用:RewriteRule ^(.*)$ http://%HTTP_HOST/$1 [R=301]【参考方案6】:

当我使用 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]

【讨论】:

【参考方案7】:

这对我有用。

<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 端口。

【讨论】:

【参考方案8】:

最好尽量避免使用 mod_rewrite。

在你的情况下,我会用这个替换重写:

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

&lt;If&gt; 指令仅在 Apache 2.4+ 中可用,根据此blog here。

【讨论】:

在托管环境中,可以使用/usr/sbin/httpd -v查看Apache的版本【参考方案9】:

Wordpress 网站上没有一个答案对我有用,但以下工作(它与其他答案相似,但有一点变化)

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

【讨论】:

不要对所有 REQUEST_URI 盲目使用此类规则(如果 URI 中有任何表单数据,或者请求元数据中有 cookie/会话 ID,则不应使用此规则)。仅用于静态公共页面/图像。完全避免使用 javascript 或活动组件(尤其是可编写脚本的视频流或活动 PDF,除非它们由您进行数字签名!仍然无法对 javascript 进行数字签名,仅将它们保留在您的安全域中)。 注意:某些图像格式是活动的并且可以编写脚本:例如,请注意 SVG。我们已经看到对一些 HTTPS 网站的攻击从 HTTP 加载 SVG 图像(使用站点的 302 重定向),并通过在 SVG 内容中插入脚本的恶意软件进行攻击......理想情况下,浏览器应该将 HTTP 子内容与 HTTPS 隔离并将其放置在沙箱中(所以 CORS安全限制也应该适用,即使它在同一个域名中...),因此“http://(domain)/...”和“https://(domain)/”将被视为不同的域CORS(不同来源),即使它们在同一个 TCP 端口号上。 @verdy_p,您所说的“使用网站的 302 重定向”到底是什么意思?您必须首先拥有服务器站点(或 TCP/IP 级别的参与节点,如 DNS 服务器、路由器),才能利用这些 HTTP 资源请求,对吧? 不一定。域上的 HTTPS 将是安全的,而同一域上的 HTTP 则不安全(即使使用 DNSSEC,漏洞利用也不需要控制 IP 或路由器或 DNS 服务器;漏洞利用可以只使用 IP 欺骗,如果没有开启 HTTPS,则无法安全检测安全会话)。因此,我坚持认为 HTTPS 站点必须通过不使用 HTTP 服务来托管图像(即使在同一个域中)(在某些需要激活单击或屏蔽那些不安全图像的浏览器中,默认情况下它甚至被拒绝)。必须禁止混合 HTTPS/HTTP:该网站的 HTTP 部分(例如跟踪像素)是可攻击的。【参考方案10】:

如果您正在寻找可以将特定 url/s 重定向到 http 的答案,请更新您的 htaccess,如下所示

RewriteEngine On
RewriteCond %HTTPS off
RewriteCond %THE_REQUEST !/(home/panel/videos|user/profile) [NC] # Multiple urls
RewriteRule ^ https://%HTTP_HOST%REQUEST_URI [L,R=301]

RewriteCond %HTTPS on
RewriteCond %THE_REQUEST /(home/panel/videos|user/profile) [NC] # Multiple urls
RewriteRule ^ http://%HTTP_HOST%REQUEST_URI [L,R=301]

它对我有用:)

【讨论】:

【参考方案11】:

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

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

【讨论】:

我希望要求反对票的选民离开 cmets 解释反对票的原因。就个人而言,除非您作为开发人员无权访问您正在开发的服务器,但您确实可以访问该页面,否则我不会选择此答案。一个问题是,您必须对每个页面上的每条路径进行硬编码才能使其正常工作。如果您可以假设为您的重要用例启用了 JavaScript,那么您最好使用 JavaScript 更改为 http。上面的答案更好,因为它们不需要javascript,因为它们发生在服务器上。 简单地说:因为 htaccess 是比这更好的选择。此外,如果您没有证书,它不会解决将 https 协议重定向到 http 的问题。 动作应该由服务器处理,而不是它可能提供的“一个”文档。 为此,您需要页面的两个版本,或者如果您通过 http 访问该页面,则需要某种方式来防止刷新。否则你创建了一个刷新循环:yourdomain.com/path -> yourdomain.com/path -> yourdomain.com/path -> ...等

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

如何通过 web.config 将 http 重定向到 https 并将 www 重定向到非 www?

如何在 Laravel 4 中将一个路由重定向到 HTTPS,将所有其他路由重定向到 HTTP?

Spring Cloud Gateway中如何将HTTP重定向到HTTPS

如何将所有 HTTP 请求重定向到 HTTPS

如何使用漂亮的 url 将 HTTP 重定向到 HTTPS?

如何将 HTTPS 重定向到 HTTP?