有效 Access-Control-Allow-Origin 回复

Valid Access-Control-Allow-Origin responses

这类似于 jquery ajax add authentication header,因为它与相同的 API 相关,但更多的是关于响应 OPTIONS 请求的有效值。

鉴于此:

$.ajax({
    url: "https://auspost.com.au/api/postcode/search.json?q=clayfield",
    headers: {
        'auth-key': '510839e3-****-****-****-6e04a56e9eb3'
    }
}, function (data) {
    var json = {
    json: JSON.stringify(data)
};
console.log(json);
});

我收到这样的回复:

Access-Control-Allow-Headers:accept, auth-key
Access-Control-Allow-Methods:GET
Access-Control-Allow-Origin:
Access-Control-Max-Age:1200
Connection:keep-alive
Content-Length:0
Date:Fri, 13 Feb 2015 03:46:42 GMT
Server:nginx

出现错误:'Access-Control-Allow-Origin' header 包含无效值 '',这意味着不允许访问我的来源。

服务器为 Access-Control-Allow-Origin header return 一个空字符串(而不是我的来源或 *)是否有效?如果 有效 - 我怎样才能让我的请求正确验证?

“Access-Control-Allow-Origin”header 包含无效值,因为它在响应中为空白。响应必须 return * 或实际指定的 ASCII 文本作为来源。

W3 建议如下

A resource can have one Access-Control-Allow-Origin header defined. The header must match the following ABNF:

Access-Control-Allow-Origin = "Access-Control-Allow-Origin" ":" ascii-origin | "*"

参见:http://www.w3.org/TR/2008/WD-access-control-20080912/#access-control-allow-origin

正如其他人所建议的那样,由服务器根据您提供的授权和来源正确 return 这些值。也许如果您不尝试发送服务器值,服务器就不会 return 无效响应。

**更新 - 2015 年 2 月 15 日**

经过进一步挖掘,我认为问题是服务器设置与目标服务器以及浏览器中 jquery / CORS 工作过程的组合。

服务器级别似乎发生的情况是,如果 AUTH-KEY 不作为 header 值出现,则服务器配置为 return 中的空字符串Access-Control-Allow-Origin 响应 header。这不符合标准,但有些人选择此作为安全预防措施,以确保不会发出无效的 CORS 请求。

由于 pre-flight W3 (http://www.w3.org/TR/cors/#preflight-request) 定义的 CORS 请求资源处理模型,此服务器行为会影响客户端行为,Jquery 和您的浏览器。

在您正确设置 AUTH-KEY 的实际请求之前 header,预检请求生成为 OPTION 请求(代替 GET),以便让服务器有机会告诉客户端 CORS 策略和身份验证是否允许处理请求。

标准还规定,您提供的 headers 实际上并未在此预检请求中发送,而是转换为名为“Access-Control-Request-Headers”的单个 header 值(http://www.w3.org/TR/cors/#http-access-control-request-headers).对于您通过 jquery 的特定请求,您将看到以下 header 转换:

Access-Control-Request-Headers: accept, auth-key

由于 auth-key 没有传递到服务器,并且如上所述,您的服务器没有 return 对 OPTION 请求的“有效”响应,因为此 OPTION 请求不包含您的实际 AUTH-KEY header 而不是 Access-Control-Request-Headers header,正是这个空 Access-Control-Response-Headers 响应在处理 XMLHttpRequest 时生成浏览器错误。

作为解决方案,我会尝试在您首选的 server-side 页面(PHP、.NET 等)中设置一个本地服务器页面,该页面将执行一个简单的 server-to-server 请求,然后对本地 server-page 代理使用你的 ajax 请求来解决上述 CORS 问题。