如何使用我的nodejs-express应用程序处理以https重定向的http请求?

时间:2018-07-16 07:51:28

标签: node.js https request hsts node-https

我正在网站中注入一些脚本标签,其来源为http:localhost:3000/css/my-page-css.css。虽然它可以在几乎所有网站上运行,但该网站还是以http的形式发送了我所有的https请求。如何处理这种情况?

我还在nodejs应用程序上配置了一个https服务器,该服务器侦听端口8443,而http侦听3000。但是,当我注入脚本标签时,它们具有指向端口3000的src URL。因此,即使我在nodejs应用程序上配置了https,它也无法正常运行,因为它将监听其他端口。

1 个答案:

答案 0 :(得分:0)

您正在使用HTTP严格传输安全性(HSTS)

使用the securityheader.com website on your URL或Chrome开发人员工具,您的网站会发回以下HTTP标头:

Strict-Transport-Security   max-age=7889238

此HTTP标头将在您的Web服务器中配置,是您的Web服务器告诉浏览器的一种方式:“在接下来的7889238秒内,仅在此域上使用HTTPS。如果有人尝试使用HTTP(通过键入或单击链接),然后在将HTTP发送到服务器之前自动将HTTP切换为HTTPS。”

这是一项安全功能,因为当前默认(如果未明确给出方案)是HTTP。这样,网站所有者就可以切换默认设置,甚至可以阻止默认设置切换回该默认设置。

HSTS是在域级别设置的,不可能在一个端口(例如443)上将其打开,而在另一个端口(例如3000)上不能将其打开-该域已打开或已关闭。

如果您确实要使用HTTP,则需要删除此标头,并从浏览器中删除该标头的记住值。虽然chrome允许您通过在URL中键入chrome://net-internals/#hsts并使用Delete选项来执行此操作,但最简单的方法是将最长使用期限从7889238更改为0,然后重新加载网站。然后完全删除标题。

这对于像localhost这样的站点特别麻烦,在localhost中您代理请求并无意中为该虚拟主机名设置了请求。您应该查看您的节点代理服务器是否允许您剥离该HTTP标头。 Some might say it would be better if browser makers ignored HSTS for localhost,但是我认为如果开发人员停止使用HTTPS并使用它,甚至在使用添加到您本地信任存储区的自签名证书的开发环境中使用HTTPS也会更好。这样一来,您可以在开发过程中避免出现诸如混合内容之类的问题,还可以使用仅HTTPS的功能(包括Brotli,HTTP / 2,地理位置等)(尽管Chrome之类的某些浏览器仍允许在{{3} }。

或者http://localhost,并根据所涉及的站点使用HTTP或不使用HTTPS。