防止http页面重定向到https页面

Prevent http page from redirecting to https page

我的网站 (userbob.com) 通常以 https 提供所有页面。但是,我试图让一个子目录 (userbob.com/tools/) 始终将内容作为 http 提供。目前,似乎 Chrome 的 HSTS 功能(我不明白它是如何工作的)正在强制我网站的页面通过 https 加载。我可以转到 chrome://net-internals/#hsts 并从 Chrome 的 HSTS 集中删除我的域,下一个查询将按我的意愿工作,而无需重定向到 https 版本。但是,如果我尝试第二次加载该页面,它最终会再次重定向。让它工作的唯一方法是在每次请求后转到 chrome://net-internals/#hsts 并从 Chrome 的 HSTS 集中删除我的域。我如何让浏览器知道我希望将 userbob.com/tools/ 中的所有页面加载为 http?我的站点使用 apache/tomcat 网络服务器。

(仅供参考,我希望工具目录中的页面通过 http 而不是 https 提供页面的原因是因为其中一些页面用于 iframe http 页面。如果我尝试通过 iframe 从 https 构建 http 页面页面我最终遇到了混合内容错误。)

您可以使用重写规则将 https 请求重定向到子目录内的 http。在 tools 目录中创建一个 .htaccess 文件并添加以下内容:

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

确保已启用 Apache mod_rewrite

HTTP 严格传输安全(或 HSTS)是您的网站可以发送到浏览器的设置,其中显示 "I only want to use HTTPS on my site - if someone tries to go to a HTTP link, automatically upgrade them to HTTPS before you send the request"。它基本上不允许您无意或有意发送任何 HTTP 流量。

这是一项安全功能。 HTTP 流量可以被拦截、读取、更改并重定向到其他域。 HTTPS-only 网站应将 HTTP 流量重定向到 HTTPS,但存在各种安全措施 issues/attacks 如果任何请求最初仍通过 HTTP 发送,因此 HSTS 会阻止这种情况。

HSTS 的工作方式是您的网站在您的 HTTPS 请求中发送一个 HTTP Header Strict-Transport-Security,其值为 max-age=31536000; includeSubDomains。在这个例子中,浏览器缓存它并激活 HSTS 31536000 秒(1 年)。您可以在浏览器的 Web 开发人员工具中或使用 https://securityheaders.io 等网站查看此 HTTP Header。通过使用 chrome://net-internals/#hsts 站点,您可以清除该缓存并再次允许 HTTP 流量。但是,一旦您通过 HTTPS 访问该站点,它将再次发送 Header,浏览器将恢复为 HTTPS-only。

因此,要永久删除此设置,您需要停止发送 Strict-Transport-Security Header。在您的 Apache/Tomcat 服务器中找到它并将其关闭。或者最好先将其更改为 max-age=0; includeSubDomains 一段时间(这会告诉浏览器在 0 秒后清除缓存,因此无需访问 chrome://net-internals/#hsts 即可将其关闭,只要您访问该站点HTTPS 获取此 Header,然后稍后完全删除 Header。

关闭 HSTS 后,您可以通过标准重定向恢复到一些页面在 HTTPS 上,一些在 HTTP 上。

但是,如果我不警告您不要返回到 HTTP,那将是我的失职。 HTTPS 是新标准,人们普遍推动所有网站转向 HTTPS 并惩罚那些不这样做的网站。阅读他的 post 了解更多信息:

https://www.troyhunt.com/life-is-about-to-get-harder-for-websites-without-https/

虽然您不能在 HTTPS 页面上构建 HTTP 内容是正确的,但您应该考虑是否有其他方法可以解决此问题。您站点上的单个 HTTP 页面可能会导致安全问题,例如泄漏 cookie(如果它们设置不正确)。 Plus 框架太可怕了,不应该再使用了:-)

基本上 any 来自 HTTPS 请求的 HTTP 301 响应表明目标重定向到 HTTP 根本不应该被任何浏览器接受,那些这样做的服务器显然违反了基本安全,或者有几个妥协。 但是,对 HTTPS 请求的 301 回复仍然可以重定向到另一个 HTTPS 目标(包括另一个域,前提是满足其他 CORS 要求)。

如果您浏览 HTTPS link(或 javascript 事件处理程序)并且浏览器开始加载 HTTPS 目标,该目标以 301 重定向回复到 HTTP,浏览器的行为应该类似于如果是 500 服务器错误,或连接失败(DNS 名称未解析,服务器未响应超时)。

这样的服务器端重定向显然是无效的。网站管理员永远不应该这样做!如果他们想关闭服务并通知 HTTPS 用户该服务托管在别处并且不再安全,他们必须 return 一个有效的 HTTPS 响应页面,根本没有重定向,这应该是一个 4xx 错误页面(很可能是 404 PAGE NOT FOUND)并且他们不应该重定向到另一个不遵守 CORS 要求或发送虚假媒体类型的 HTTPS 服务(例如第三方托管搜索引擎或停车页面)(不遵守请求的语言并以另一种语言显示该页面)。

实现 HSTS 的浏览器是完全正确的,并且在朝着正确的方向发展。但我真的认为 CORS 规范一团糟,只是进行了调整以仍然允许广告网络托管和控制他们自己广播到其他网站的广告。

我强烈认为,出于正当理由仍想展示广告(或任何用于受众测量的跟踪器)的严肃网站可以自己托管这些 ads/trackers,在自己的域中并使用相同的协议:服务器可以仍然通过 downloading/refreshing 这些广告自己获取他们想要播放的广告内容并维护自己的本地缓存。如果他们希望第三方分析这些数据,他们可以通过收集他们需要和想要的数据并在自己的服务器上过滤来跟踪他们的观众:网站必须认真执行自己的隐私要求。

我现在讨厌那些太多的网站,这些网站在访问时会被数十个第三方跟踪,包括非常侵入性的网站,如 Facebook 和大多数广告网络,以及许多非常薄弱的​​第三方服务,这些服务非常差 quality/security 并发送他们无法控制的非常糟糕的内容(包括虚假广告、虚假新闻、宣传非法活动、非法业务、无效年龄分级...)。

让我们return回到网络的起源:一个站点、一个域、一个第三方。这并不意味着他们不能 link 访问其他第三方网站,但这些必须仅通过明确的用户操作(点击或单击)才能完成,并且访问者必须能够知道这将转到哪里,或者将显示内容。

这甚至可以用于在新闻文章中插入视频(例如 Youtube):新闻网站可以为自己托管框架的静态图像缓存和 "play" 按钮的图标:当用户单击该图标时,它将开始激活第三方视频,在这种情况下,窃贼将直接与该用户交互并可以收集其他数据。但未激活的内容将仅由源网站根据其自己发布的政策进行跟踪。

在我的本地开发环境中,我使用 apache 服务器。对我有用的是: 在 sites-availabe/yoursite.conf 中打开您的配置文件。然后在您的虚拟主机中添加以下行: Header always set Strict-Transport-Security "max-age=0"。重新启动服务器。