CORS header 'Access-Control-Allow-Origin' 不匹配...但确实匹配‼
CORS header 'Access-Control-Allow-Origin' does not match... but it does‼
我正在 Java 中制作一个非常简单的 JSON API。它实际上是一个服务于 object 坐标的 Project Zomboid mod。这是我的 HTTP 处理程序的样子:
public class JSONZomboid implements HttpHandler
{
@Override
public void handle(HttpExchange t) throws IOException {
// HEADERS
Headers headers = t.getResponseHeaders();
headers.set("Content-Type", "text/json");
headers.set("Access-Control-Allow-Origin", "pzmap.crash-override.net");
t.sendResponseHeaders(200,0);
//BODY
OutputStream os = t.getResponseBody();
os.write("{\n".getBytes());
// generate JSON here
os.write("}".getBytes());
os.close();
}
}
我想使用用户脚本将其加载到 Project Zomboid 地图项目中,这意味着我需要启用 CORS 才能连接。这是通过简单的代码完成的:
PlayerRenderer.prototype.fetchInfo = function() {
$.get("http://127.0.0.1:8000/test", {}, this.displayPoints.bind(this));
}
但是我得到这个错误:
Warning: Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://127.0.0.1:8000/test. (Reason: CORS header 'Access-Control-Allow-Origin' does not match 'pzmap.crash-override.net').
即使在控制台中我也能清楚地看到错误是误导性的:
如果我不讨厌 CORS,我现在就会开始讨厌它了。你能告诉我允许来源 header 中的实际字符串是什么吗?
上面的评论 #1 是正确的:CORS 需要 Access-Control-Allow-Origin header 来匹配客户端的原始请求(对于 end-to-end SSL 体验)。所以在这种情况下,请确保在 Access-Control-Allow-Origin header 中设置 pzmap.crash-override.net。
两个注意事项:
1- 不管你在网上读到什么,nginx 目前要求将多个条目列为单独的行,a la:
add_header Access-Control-Allow-Origin "https://developers.google.com";
add_header Access-Control-Allow-Origin "https://imasdk.googleapis.com";
2 - 另外,尽管您可能在网上阅读过一些内容,但通配符的使用并不正确。并非所有客户端(即浏览器)都允许它。
我为同样的问题苦苦挣扎了几个小时,发现我在 origin
: https://foo.com/
的末尾添加了一个正斜杠,而它应该是 https://foo.com
. (谈论一个重要的面部表情时刻!)
我的(正在工作)Express Node.JS 设置:
const express = require('express');
const cors = require('cors');
const app = express();
app.use(cors({
methods: 'GET,POST,PATCH,DELETE,OPTIONS',
optionsSuccessStatus: 200,
origin: 'https://foo.com'
}));
app.options('*', cors());
实际问题是 Access-Control-Allow-Origin
header 应该包括协议,而不仅仅是主机名。如果网络浏览器简单地将这部分包含在错误消息中会更好。
所以在上面,做:
headers.set("Access-Control-Allow-Origin", "http://pzmap.crash-override.net");
我正在 Java 中制作一个非常简单的 JSON API。它实际上是一个服务于 object 坐标的 Project Zomboid mod。这是我的 HTTP 处理程序的样子:
public class JSONZomboid implements HttpHandler
{
@Override
public void handle(HttpExchange t) throws IOException {
// HEADERS
Headers headers = t.getResponseHeaders();
headers.set("Content-Type", "text/json");
headers.set("Access-Control-Allow-Origin", "pzmap.crash-override.net");
t.sendResponseHeaders(200,0);
//BODY
OutputStream os = t.getResponseBody();
os.write("{\n".getBytes());
// generate JSON here
os.write("}".getBytes());
os.close();
}
}
我想使用用户脚本将其加载到 Project Zomboid 地图项目中,这意味着我需要启用 CORS 才能连接。这是通过简单的代码完成的:
PlayerRenderer.prototype.fetchInfo = function() {
$.get("http://127.0.0.1:8000/test", {}, this.displayPoints.bind(this));
}
但是我得到这个错误:
Warning: Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://127.0.0.1:8000/test. (Reason: CORS header 'Access-Control-Allow-Origin' does not match 'pzmap.crash-override.net').
即使在控制台中我也能清楚地看到错误是误导性的:
如果我不讨厌 CORS,我现在就会开始讨厌它了。你能告诉我允许来源 header 中的实际字符串是什么吗?
上面的评论 #1 是正确的:CORS 需要 Access-Control-Allow-Origin header 来匹配客户端的原始请求(对于 end-to-end SSL 体验)。所以在这种情况下,请确保在 Access-Control-Allow-Origin header 中设置 pzmap.crash-override.net。
两个注意事项:
1- 不管你在网上读到什么,nginx 目前要求将多个条目列为单独的行,a la: add_header Access-Control-Allow-Origin "https://developers.google.com"; add_header Access-Control-Allow-Origin "https://imasdk.googleapis.com";
2 - 另外,尽管您可能在网上阅读过一些内容,但通配符的使用并不正确。并非所有客户端(即浏览器)都允许它。
我为同样的问题苦苦挣扎了几个小时,发现我在 origin
: https://foo.com/
的末尾添加了一个正斜杠,而它应该是 https://foo.com
. (谈论一个重要的面部表情时刻!)
我的(正在工作)Express Node.JS 设置:
const express = require('express');
const cors = require('cors');
const app = express();
app.use(cors({
methods: 'GET,POST,PATCH,DELETE,OPTIONS',
optionsSuccessStatus: 200,
origin: 'https://foo.com'
}));
app.options('*', cors());
实际问题是 Access-Control-Allow-Origin
header 应该包括协议,而不仅仅是主机名。如果网络浏览器简单地将这部分包含在错误消息中会更好。
所以在上面,做:
headers.set("Access-Control-Allow-Origin", "http://pzmap.crash-override.net");