即使指定了正确的标头,CORS AJAX请求也会失败

时间:2016-12-04 16:10:03

标签: php angularjs ajax apache cors

我正在尝试从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);
});

请求失败并在控制台中显示此错误: XMLHttpRequest cannot load https://thorin.epizy.com/cors.php?url=Place%2FGetClosestPlacesExtension%3Fcoordinates%3Dx%3D600593%2Cy%3D6646876%26proposals%3D12. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://tjespe.github.io' is therefore not allowed access.

在Chrome中打开Network面板时,我发现CORS标头不存在: enter image description here

但是,当我直接在浏览器中访问该页面(在url字段中键入url)并打开Network面板时,所有正确的标题都存在: enter image description here

我也试过从其他域上的页面发送请求,但是我得到了相同的错误,没有CORS头。这对我来说毫无意义,我不知道如何解决它。我真的很感激任何帮助。

1 个答案:

答案 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时,您需要使用withCredentialswithCredentials: 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'为'*',则不支持凭证。)