【问题标题】:CORS AJAX-request fails even though the correct headers are specified即使指定了正确的标头,CORS AJAX 请求也会失败
【发布时间】:2017-04-19 01:00:31
【问题描述】:

我正在尝试将 AJAX 请求从托管在 Github 页面(使用 https)上的页面发送到托管在不同域(也是 https)上的 php 脚本。

这是我在 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 标头。这对我来说意义不大,我不知道如何解决它。非常感谢任何帮助。

【问题讨论】:

    标签: php angularjs ajax apache cors


    【解决方案1】:

    出于一个奇怪的原因,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 使用 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”为“*”,则不支持凭据。

    【讨论】:

    • 哇,感谢您对它的深入研究!我将更改我的代码,看看它是否有效。
    猜你喜欢
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    • 2014-07-26
    • 2017-12-08
    • 2013-05-18
    相关资源
    最近更新 更多