阻止 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 文件使用 script
和 link
加载同一文件夹中的一些资源。因此没有外部资源链接(所有资源都托管在本地的同一文件夹中)。
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 路由请求,服务器也可用于处理请求。
我有一个简单的节点 js/express 应用程序,其路由将 public 文件夹中的 HTML 文件发送给用户,例如
res.sendFile(path.resolve('public/sample.html'));
此 HTML 文件使用 script
和 link
加载同一文件夹中的一些资源。因此没有外部资源链接(所有资源都托管在本地的同一文件夹中)。
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 路由请求,服务器也可用于处理请求。