我正在尝试从Github Pages上托管的页面(使用https)向托管在不同域(也是https)上的php脚本发送AJAX请求。
这是我在AngularJS控制器中使用的代码(尽管我不认为这是问题):
$http.get('//thorin.epizy.com/cors.php?url=Place%2FGetClosestPlacesExtension%3Fcoordinates%3Dx%3D'+Math.round(vm.coords[0])+'%2Cy%3D'+Math.round(vm.coords[1])+'%26proposals%3D12').success(function (data) {
vm.success = true;
console.log('Recieved data from Ruter:',data);
});
在Chrome中打开Network
面板时,我发现CORS标头不存在:
但是,当我直接在浏览器中访问该页面(在url字段中键入url)并打开Network
面板时,所有正确的标题都存在:
我也试过从其他域上的页面发送请求,但是我得到了相同的错误,没有CORS头。这对我来说毫无意义,我不知道如何解决它。我真的很感激任何帮助。
答案 0 :(得分:2)
由于一个奇怪的原因,thorin.epizy.com/cors.php
没有发送没有Cookie的CORS标头:
curl -I 'http://thorin.epizy.com/cors.php?[...]' <other headers>
Date: Sun, 04 Dec 2016 16:42:57 GMT
Content-Type: text/html
Content-Length: 920
Connection: keep-alive
Vary: Accept-Encoding
Expires: Thu, 01 Jan 1970 00:00:01 GMT
Cache-Control: no-cache
使用Cookie,我们会收到正确的标题:
curl -I -H 'Cookie: __test=b142b58439ba4f78e04c32cd1ba0a991' 'http://thorin.epizy.com/cors.php?[...]' <other headers>
HTTP/1.1 200 OK
Server: nginx
Date: Sun, 04 Dec 2016 16:45:04 GMT
Content-Type: application/json;charset=utf-8
Connection: keep-alive
Vary: Accept-Encoding
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept
Access-Control-Allow-Methods: GET, POST, PUT, OPTIONS
Cache-Control: max-age=0
Expires: Sun, 04 Dec 2016 16:45:04 GMT
当您执行跨站点请求并想要Cookie时,您需要使用withCredentials
(withCredentials: true
with angularjs)来询问它们。
然后,服务器需要change two things:
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
更改为Access-Control-Allow-Origin: your-web-site.com
(通常取自Origin
请求标题)如果您没有,您将收到以下消息:
阻止跨源请求:同源策略禁止在“http://thorin.epizy.com/cors.php?url=[...]”处读取远程资源。 (原因:如果CORS标题'Access-Control-Allow-Origin'为'*',则不支持凭证。)