【发布时间】:2020-09-27 05:56:56
【问题描述】:
我有一个我无法解决的问题,尽管已经有几个这样的问题被问到了。然而,没有一个答案对我有帮助:
我有一个这样的简单请求:
$.ajax({
type: "POST",
url: webServiceUrl,
data: JSON.stringify(obj),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
alert(msg.d.StatusMessage);
});
根据我的错误消息,我收到以下错误消息:
从源“http://another-server.net”访问“https://www.my-site.com/myFile.php”处的 XMLHttpRequest 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:没有“Access-Control-Allow-Origin”标头出现在请求的资源上。
我阅读了一些相关信息并尝试了几种方法,例如将 dataType 更改为 jsonp、添加参数 crossDomain: true 以及添加特定的标头,但错误仍然存在。在我的服务器端,我看到请求正在被识别,但我没有任何值或有效负载。
我的 PHP 文件如下所示:
<?php
header("Access-Control-Allow-Origin: *");
$arr = array ('item1'=>"test1",'item2'=>"test2",'item3'=>"test3");
$test = json_encode($arr);
echo $test;
当我在数据类型中使用jsonp 而不是json 时,我什至得到了一个http 代码200,但是另一个通知出现了,我仍然缺少数据:
跨域读取阻塞 (CORB) 阻止了跨域响应 https://my-site.com/
还有什么我可以尝试的吗?
这是我记录的请求的样子:
HTTP_HOST = www.my-site.com
HTTP_CONNECTION = close
HTTP_ACCEPT_LANGUAGE = de,en-US;q=0.9,en;q=0.8,de-DE;q=0.7
HTTP_ACCEPT_ENCODING = gzip, deflate, br
HTTP_USER_AGENT = Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36
HTTP_REFERER = http://another-site.net
HTTP_SEC_FETCH_DEST = empty
HTTP_SEC_FETCH_SITE = cross-site
HTTP_SEC_FETCH_MODE = cors
HTTP_ORIGIN = http://another-site.net
HTTP_ACCESS_CONTROL_REQUEST_HEADERS = content-type
HTTP_ACCESS_CONTROL_REQUEST_METHOD = POST
HTTP_ACCEPT = */*
HTTP_CACHE_CONTROL = no-cache
HTTP_PRAGMA = no-cache
【问题讨论】:
-
headers: { 'Access-Control-Allow-Origin': 'https://my-site.com' }—Access-Control-Allow-Origin是一个 response 标头。它没有业务正在接受请求。 -
crossDomain: true无效,除非您发出 same origin 请求,该请求被重定向为跨源。把它排除在外。 -
data: "{'qvDataTable':" + JSON.stringify(obj) + "}",— 您正在生成无效的 JSON。不要通过将字符串混合在一起来生成 JSON。只需制作您的对象并通过JSON.stringify传递整个事情 -
“当我在数据类型中使用 jsonp 而不是 json 时”- JSONP (a) 与未格式化为 JSON 的响应不兼容,并且 (b) 与发出 POST 请求不兼容
-
鉴于
header("Access-Control-Allow-Origin: *");,我会期望预检选项响应包含Access-Control-Allow-Origin标头。你应该做一些调试。将日志语句添加到 PHP 以确保触发了正确的脚本。使用浏览器开发者工具中的“网络”选项卡查看发出的请求和您得到的响应。