为了解决CORS问题,我在那里写了
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST');
header("Access-Control-Allow-Headers: X-Requested-With");
在我的服务器站点中
但是在我的开发过程中,我看到了这个错误
The 'Access-Control-Allow-Origin' header contains multiple values '*, *', but only one is allowed. Origin 'http://localhost' is therefore not allowed access.
我以为允许起源:*会解决一切吗?但是为什么它说标题包含多个值?
这是意外启用 CORS 两次时的常见问题。检查以确保您没有在 apache 中启用它,或者标头未被设置两次。作为健全性检查,您可以尝试删除标题并在提供响应之前将其添加回去。
前任:
header_remove('Access-Control-Allow-Origin');
header('Access-Control-Allow-Origin: *');
由于浏览器安全限制,大多数 Ajax 请求都受同一源策略的约束;该请求无法成功地从不同的域、子域、端口或协议检索数据。但脚本和 JSONP 请求不受同源策略限制的约束。
如果您还没有使用过 JSONP。维基百科说
JSONP或"带填充的JSON"是对基本JSON数据的补充 格式,允许页面请求的使用模式等 有意义地使用来自主服务器以外的服务器的 JSON。
所以你的ajax调用应该是这样的:
$.ajax({
type: 'GET',
crossOrigin: true,
dataType: "jsonp",
url: url,
success: function(data) {
console.log(data);
}
});
使用 * 将不起作用。下面的PHP代码将接受来自所有域的所有请求,并在IE,Firefox,Chrome和Safari中工作。
$origin=isset($_SERVER['HTTP_ORIGIN'])?$_SERVER['HTTP_ORIGIN']:$_SERVER['HTTP_HOST'];
header('Access-Control-Allow-Origin: '.$origin);
header('Access-Control-Allow-Methods: POST, OPTIONS, GET, PUT');
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Headers: Authorization, X-Requested-With');
header('P3P: CP="NON DSP LAW CUR ADM DEV TAI PSA PSD HIS OUR DEL IND UNI PUR COM NAV INT DEM CNT STA POL HEA PRE LOC IVD SAM IVA OTC"');
header('Access-Control-Max-Age: 1');
接受来自所有域的请求是不安全的。有关更好(但稍微复杂)的解决方案,请参阅此处: 适用于IE,Firefox,Chrome和Safari的CORS