0

我在网站中注入了一些脚本标签,源代码如http:localhost:3000/css/my-page-css.css. 虽然它几乎可以在所有网站上运行,但有一个特定的网站以某种方式将我的所有http请求都发送为https. 我该如何处理这种情况?

我还在我的 nodejs 应用程序上配置了一个 https 服务器,它监听端口8443和 http 监听3000。但是,当我注入我的脚本标签时,它们的 src URLS 指向 port 3000。因此,即使我在我的 nodejs 应用程序上配置了 https,它也不会工作,因为它会监听不同的端口。

4

1 回答 1

0

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

使用您的 URL 上的 securityheader.com 网站或 Chrome 开发人员工具,我们会看到您的网站发回以下 HTTP 标头:

Strict-Transport-Security   max-age=7889238

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

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

HSTS 是在域级别设置的,不能为一个端口(例如 443)打开它,但不能为另一个端口(例如 3000)打开它 - 它可以为该域打开或关闭。

如果您真的想使用 HTTP,那么您需要删除此标头并从浏览器中删除此标头的记忆值。虽然 chrome 允许您通过输入chrome://net-internals/#hstsURL 并使用删除选项来执行此操作,但最简单的方法是将最大年龄从 7889238 更改为 0,然后再次加载网站。然后完全删除标题。

这对于像 localhost 这样的站点来说尤其烦人,您在其中代理请求并无意中为该虚拟主机名设置了它。您应该查看您的节点代理服务器是否允许您剥离该 HTTP 标头。有人可能会说,如果浏览器制造商忽略 localhost 的 HSTS 会更好,但我认为如果开发人员停止与 HTTPS 抗争,甚至将其用于使用添加到本地信任存储的自签名证书的开发环境,那会更好。这是您可以避免混合内容之类的问题,并且还可以在开发时使用仅 HTTPS 的功能(包括 Brotli、HTTP/2、地理位置...等)(尽管 Chrome 等一些浏览器仍然允许在http://上使用这些功能)本地主机)。

或者,为您的每个开发站点设置一个本地 DNS 别名,并根据相关站点的需要使用或不使用 HTTPS。

于 2018-07-16T11:02:59.627 回答