如何从 HTTPS 重定向到 HTTP 而不会出现烦人的错误消息

Posted

技术标签:

【中文标题】如何从 HTTPS 重定向到 HTTP 而不会出现烦人的错误消息【英文标题】:How to redirect from HTTPS to HTTP without annoying error messages 【发布时间】:2010-10-13 16:47:25 【问题描述】:

我想在 HTTPS 登录后将用户重定向到网站上的 HTTP 页面。对整个站点使用 HTTPS 是不会发生的。

到目前为止,我有以下内容:

    用户将登录表单发布到安全站点 安全服务器验证凭据 安全服务器向客户端发送 302 重定向

这可行,但在我的机器上使用 IE6 时,用户会收到一条错误消息,因为默认设置是在退出安全页面时发出警告。这些错误对我来说是一个可用性杀手,因此是一个阻碍。我改变了它,所以第 3 步是

服务器发送带有元刷新的 html 代码

但这很慢;即使在我的本地机器上,它也明显比执行 302 重定向慢。

有没有更好的方法来实现在人们使用的标准设置上轻松重定向的目标? IE6 占我们流量的 20%-25%。另外,有没有人知道哪些浏览器会发出警告,哪些浏览器不会发出 302 重定向警告?我正在考虑将 IE6 列入黑名单,以便只有它获得缓慢的元刷新,而其他人获得快速的 302。

【问题讨论】:

如果您将表单发布到 https 站点,那么响应不是来自 https 站点,从而使用户继续使用 https 吗? @matt:响应来自 https 服务器,但该响应包含重定向指令。某些重定向模式会发出警告,而其他重定向模式则不会。警告很可怕,而且 IMO 毫无意义(因为并非所有页面重定向模式都会发出警告)。 @alex 感谢您对我做出这样的判断。当您惩罚我公司中其他人做出的我无法控制的决定时,这确实有助于解决我的技术问题。 “在整个网站上使用 HTTPS 是不可能的。” - 听起来你是决策者,而且你对此非常坚定。向贵公司的决策者解释 1) 加密登录的资源已经用完然后浪费了; 2) 默认加密,完全避免您的技术问题; 3) 你正在让你的用户产生一种虚假的安全感隐私; 4) 询问他们是否希望他们的个人信息通过互联网传播; 5) 与时俱进,因为信任在当今时代很有价值。 你需要放松。我意识到这是从 2009 年开始的,但我留下评论的原因是任何现在或将来访问此问题的人都可以阅读 cmets 并查看其他选择。您的问题仍然是相关的,并且在搜索结果中排名很高,这就是我到达这里的方式。我并不是要攻击你,但我确实想指出建立 HTTPS 会话的缺陷,只是为了在之后立即废弃它,而你正试图解决重定向问题。如果您觉得我不尊重您,我向您道歉。 【参考方案1】:

恢复一个旧主题,但为了完成发布以下内容,以便其他开发人员可以选择实施

在不显示警告消息的情况下将 https 移动到 http 的一种方法是使用 javascript 使用客户端重定向。

步骤

    用户在 https 表单上输入登录详细信息,然后单击登录按钮 登录按钮将发回 https 表单以进行登录验证(假设登录正确)将重定向到也在 https 下的保留页面并显示消息(请等待网站重定向您) 此保留页面执行 javascript 重定向到 http 页面

不会显示浏览器警告消息

HTH

【讨论】:

这个解决方案听起来很实用,所以我赞成它,但是它遇到了与元刷新解决方案相同的问题,即它涉及用户下载整个 html 文档,然后处理它,(和更糟糕的是,另外,执行 javascript),在他们离开中间页面并前往预期目的地之前。如果我有理由怀疑元刷新是否有效,我只会使用这种方法。 是的,你是对的,我部署的完整解决方案是拥有一个通用的 https 到 http 重定向页面,内容非常少。服务器进程将处理生成负载脚本以及添加具有轻微时间差异的元标记刷新。由于页面非常简约,它的加载速度非常快,但无法避免往返。 这是解决我问题的完美方案!我必须将无害的表单内容提交给非 https 表单处理程序。几行 JavaScript,警告就消失了。至少对于有 JS 能力的用户来说:)【参考方案2】:

我正在考虑将 IE6 列入黑名单,以便只有它获得缓慢的元刷新,而其他人获得快速的 302。

我会做这样的事情。还要在正文中包含一个纯 HTML 链接以方便访问。

请注意,其他一些浏览器确实会在离开 HTTPS 站点时发出类似的警告,但在他们的情况下,它会伴随一个(通常预先勾选)“不要再问我”按钮。因此,当他们到达您的网站时,他们几乎肯定会告诉该警告消失。这不会使警告变得毫无意义,但至少可以缓解问题。

    安全服务器向客户端发送 302 重定向

您不应该 302 响应 POST。一个认真对待 HTTP RFC 的理论浏览器可能会通过将表单重新发布到新 URL 来响应这一点。 (具有讽刺意味的是,这将使 IE6 关于信息“被重新传输到非安全站点”的警告减少误导。)改为使用“303 See other”。

【讨论】:

302 响应实际上是由 J2EE 框架发送的。我只是使用 response.sendRedirect(url)。 很遗憾,sendRedirect 不提供对其他 30x 状态码的访问,但您可以手动完成:response.setStatus(HttpServletResponse.SC_SEE_OTHER); response.setHeader("位置", "..."); @bobnice:手动操作会起作用,但实际上我会避免这样做,因为我们还使用了 sendRedirect 方法的其他副作用,即 url 重写。【参考方案3】:

我认为没有其他方法。该错误消息是为了用户的利益,并且现在也出现在 IE 7 和 Firefox 3 中。我知道的唯一防止它的方法是在浏览器中将您的网站添加为受信任的。

更新:哦,原来不是混合内容错误。我知道你指的是哪一个,但我仍然认为你不能禁用该错误。通常,安全错误是为了保护用户免受潜在危险网站的侵害,因此,(可能不安全的)网站本身不能禁用安全错误。

【讨论】:

我在 FF3 或 IE7 中都没有看到该消息。只有 IE6。 问题是,这条消息并不总是触发。使用 302 重定向是否比使用元刷新更安全?可能不会,这就是为什么较新的浏览器不显示该消息的原因。

以上是关于如何从 HTTPS 重定向到 HTTP 而不会出现烦人的错误消息的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 301 重定向而不是 302 将 HTTP 站点重定向到 HTTPS 站点

带有 mod24_ssl 的 Apache httpd24 不会从 http 重定向到 https

从https重定向到http而没有我的网站的证书

如何停止从 HTTP 到 HTTPS 的重定向

从 HTTP 重定向到 HTTPS - IIS 7.5

如何结合两个 Apache htaccess 重定向条件(http 到 https 和非 www 到 www)