服务器不会返回启用 CORS 的 AJAX GET 请求

Posted

技术标签:

【中文标题】服务器不会返回启用 CORS 的 AJAX GET 请求【英文标题】:Server will not return AJAX GET request with CORS enabled 【发布时间】:2013-04-10 22:56:16 【问题描述】:

我正在尝试启用外部资源以向我的服务器发出 GET 请求。现在我只是在我的个人服务器上通过godaddy托管来测试它。这可能是个问题吗?

我在尝试向其发出请求的页面上有以下代码

//page.php
<?php
header("Content-Type: application/json")
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET');  

include_once 'php_dom/simple_html_dom.php';
include_once 'phpQuery.php';


if(isset($_GET['item']))
    echo json_encode(array("data" => $_GET['item']));

else
    echo json_encode(array("Error"=>"No item provided"));

我尝试发出这样的请求(显然是我的 URL),但我没有收到任何回复。

$.getJSON("http://www.example.com/page.php?item=123&format=json&callback=?", function(data) 
    alert(data);
);

Chrome 开发者显示一个成功的请求,但没有返回任何内容。我做错了什么吗?

【问题讨论】:

为了测试,添加else echo json_encode(array("Error"=&gt;"No item provided"));。另外,不要忘记设置适当的 Content-Type 标头...header("Content-Type: application/json") 这至少应该确定是否正在调用脚本并且这是一个逻辑错误,或者您是否没有得到任何响应。顺便说一句,网络选项卡是否显示带有空正文的 http 200 响应或??? 您从什么来源发出请求?是来自本地文件还是其他服务器? 我正在本地主机上运行服务器,向我的“实际”服务器发出请求。 @Basic 我更新了上面的代码。还是什么都没有。 【参考方案1】:

当您使用callback=? 时,响应将作为 JSONP 处理。试试这样的:

if(isset($_GET['item']) && isset($_GET['callback']))
    echo $_GET['callback'].'('.json_encode(array("data" => $_GET['item'])).');';

...或省略回调参数。

【讨论】:

我以为回调=?如this post 所述,必须触发 JSONP +1 不错的收获,我错过了。 @user1443519 对于 没有 具有 Access-Control-Allow 标头的 x 域请求,JSONP 是必需的 那么,这意味着我需要它吗?我是新手,所以我不确定我是否正确解释它。考虑到它不起作用,显然有问题。 @Basic,为什么 OP 的原始代码 工作,因为它确实有 CORS 标头? @user1443519:您不需要 JSONP,因为您将 Access-Control-Allow-Origin-header 设置为 '*',但是当您使用回调参数时,响应应该是 JSONP。跨度>

以上是关于服务器不会返回启用 CORS 的 AJAX GET 请求的主要内容,如果未能解决你的问题,请参考以下文章

Bottle Py:为 jQuery AJAX 请求启用 CORS

如何为 nodejs Express 服务器启用 CORS?

启用从 jQuery ajax 到不在 IIS 中托管的 WCF 服务的 CORS POST

如何使用 Web 服务和 jQuery Ajax 启用 CORS

带有自定义标头的 Ajax 请求发送到启用 CORS 的 Web API 服务器

尽管我的服务器启用了标头,但 AJAX CORS 请求失败 - (Access-Control*)