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

问题描述:

我有一个网站(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页面

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

HTTP严格传输安全性(或HSTS)是您的网站可以发送给浏览器的设置,其中指出“我只想在我的网站上使用HTTPS - 如果有人试图访问HTTP链接,请自动将其升级到HTTPS你发送请求“。它基本上不会允许您无意或故意发送任何HTTP流量。

这是一项安全功能。 HTTP流量可被拦截,读取,更改并重定向到其他域。仅HTTPS的网站应该将HTTP流量重定向到HTTPS,但如果任何请求最初仍通过HTTP发送,则存在各种安全问题/攻击,因此HSTS会阻止此操作。

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

因此,要永久删除此设置,您需要停止发送该标题Strict-Transport-Security标题。在Apache/Tomcat服务器中找到并关闭它。或者更好的做法是先将其更改为max-age=0; includeSubDomains(它告诉浏览器在0秒后清除缓存,并在不访问chrome://net-internals/#hsts的情况下将其关闭,只要您通过HTTPS访问该站点以拾取此标题,并且然后完全以后删除页眉。

一旦你关闭HSTS可以恢复到对用标准重定向HTTP上的HTTPS一些网页和一些。

但是这将是我的疏忽不提醒你反对回到HTTP。HTTPS是新的标准,并且有一个普遍的推动,鼓励所有的站点转移到HTTPS并惩罚那些已经完成的。阅读他的帖子了解更多信息:https://www.troyhunt.com/life-is-about-to-get-harder-for-websites-without-https/。虽然你是正确的, nt在HTTPS页面上,你应该考虑是否有另一种方法来解决这个问题。您网站上的单个HTTP页面可能导致安全问题,如泄漏Cookie(如果它们未正确设置)。加上帧是可怕的,不应该再使用:-)

+1

感谢您的彻底解答。我最终修改了我的工具,只支持iframing https页面。 – John

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

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

确保阿帕奇mod_rewrite启用。

+0

谢谢你的建议。但是,如果我这样做,Chrome最终会显示ERR_TOO_MANY_REDIRECTS错误。看起来好像我的服务器试图以这种方式强制http,Chrome坚持认为该页面应该被加载为https,并且服务器以301页面重定向到http页面,然后Chrome请求https页面,并且该循环重复,直到Chrome放弃。 – John