【发布时间】:2022-02-06 14:33:58
【问题描述】:
如何同时获得https://example.com 和https://www.example.com 以供端点连接? socket.io 在 http://example.com 连接没问题 但不是https://www.example.com
我的服务器看起来像
const server = http.createServer(app);
const io = socketIo(server, {
cors: {
origin: "https://www.example.com:3000",
methods: ["GET", "POST"],
allowedHeaders: ["my-custom-header"],
credentials: true
}});
我的客户端端点看起来像这样
const ENDPOINT = 'https://example.com/';
【问题讨论】:
-
配置您的 DNS 以将 example.com 和 www.example.com 指向相同的主机 IP 地址,然后使用您的 cors 配置支持这两个域。然后,任一 URL 将转到同一主机。
-
添加的来源包括 www.example.com 和 example.com 但基于我的客户端 ENDPOINT 如果我转到 www 版本,反之亦然,它会被阻止 例如,如果我将 ENDPOINT 放到 example.com 并在浏览器上转到 example.com,它可以工作,但当我到达 www.example.com 时却不行,因为它被 cors 阻止,如果我将其更改为 www,同样会发生相反的情况。 example.com。
-
``` const ENDPOINT = 'example.com'; const socket = io(ENDPOINT, { withCredentials: true, extraHeaders: { "my-custom-header": "my-custom-header" } }); socket.on("data", data => { setResponse(data); } ```
-
将端点设置为
${window.location.hostname}/解决了我的问题,但我仍然不知道为什么浏览器地址必须与我的端点匹配才能让 cors 不停止它 -
显然是因为您没有正确执行服务器端 COR 的工作。如果协议、域和端口都匹配,那么 COR 就不是问题。如果协议、域或端口不同,那么您的服务器端代码必须允许 COR 访问。仅供参考,如果您在从客户端连接时将
transports: ['websocket']设置为选项,那么它将直接转到完全不受 COR 限制的 webSocket 连接。