阻止 Docker/Azure 在 Node js/Express 服务器上加载 https 而不是 http 上的资源

Prevent Docker/Azure from loading resource on https instead of http on Node js/Express Server

我有一个简单的节点 js/express 应用程序,其路由将 public 文件夹中的 HTML 文件发送给用户,例如 res.sendFile(path.resolve('public/sample.html')); 此 HTML 文件使用 scriptlink 加载同一文件夹中的一些资源。因此没有外部资源链接(所有资源都托管在本地的同一文件夹中)。 HTML 样本:

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="css/sample.css" rel="stylesheet">

    <script src="/socket.io/socket.io.js"></script>
</head>

<body>
    <div>SAMPLE SITE</div>
  
    <script src="scripts/socket.io.js"></script>
    <script src="scripts/jquery-3.6.0.slim.min.js"></script>
    <script src="scripts/sample-connect.js"></script>
</body>

这个 express 服务器是 运行 在 docker 上-由这样的配置组成:

version: '3.8'
services:
    app-server:
        container_name: sample-server
        image: sampleregistery.azurecr.io/sample-server
        stdin_open: true
        depends_on: 
        - a-server
        - b-server
        - c-websocket-server
        restart: always
        build: app-server
        domainname: "sample-service"
        ports: 
        - 3003:3003
        networks: 
        - sample-app
        deploy:
        resources:
            limits:
            cpus: '0.5'
            # memory: 4.1
            reservations:
            cpus: '0.2'
            # memory: 2.1
        env_file: 
        - sample.env
        environment:
        - PORT=${PORT:-3003}
        - IO_ORIGIN_WHITELIST=${IO_ORIGIN_WHITELIST:-http://localhost:8080,http://localhost:80}
        - FRAME_ACCESS_WHITELIST=${FRAME_ACCESS_WHITELIST:-'self',http://localhost:8080,http://localhost:80}

docker-compose 旋转实例没有问题。

我已将该映像与其他映像一起部署到 Azure 容器注册表。我还从这些图像中创建了容器实例。一切正常。

问题是: FQDN 由 Azure 为容器组自动生成为 http://sample-service.centralus.azurecontainer.io,并且可以使用端口“3003”访问快速服务器。当我在浏览器上访问网站时,资源是通过 HTTPS 而不是 HTTP 加载的,因为请求的地址是 HTTP(服务器没有附加 SSL 证书)。这在网站上带来了 Failed to load resource: net::ERR_SSL_PROTOCOL_ERROR 的错误。我注意到该站点正在通过 HTTPS.

访问所有资源

PS:这在本地主机上运行良好,无需通过 HTTPS 加载资源,显然。

我已经搜索过这个问题是否来自 docker 或 azure 容器实例,但我无法找到任何解决方案。

问题: 在 HTTP 上加载站点时,如何防止资源被其他协议(在本例中为 HTTPS)访问? Docker 和 Azure 在这里被提及是因为我只在使用 Azure 容器时遇到过这种情况。

更新 1: 我还将 HTML 文件的相对路径更改为绝对路径。源代码显示 HTTP 地址,但资源请求仍然使用 HTTPS。 问题仍然存在。

ACI 通过 HTTPS 重定向资源请求的原因仍然未知。

但是,我能够通过启用带有 sidecar 容器的 TLS(docker-compose YAML 文件上的配置)来解决这个问题。 在这种情况下,我使用了 NGINX Web 服务器。因此,即使 ACI 通过 HTTPS 路由请求,服务器也可用于处理请求。