Cors 策略错误:它没有 HTTP ok 状态
Posted
技术标签:
【中文标题】Cors 策略错误:它没有 HTTP ok 状态【英文标题】:Cors Policity Error: It does not have HTTP ok status 【发布时间】:2021-07-03 07:40:57 【问题描述】:我在php
中创建了自己的restful 应用程序,它将API 公开给javascript
应用程序。除非我在响应头中插入http_response_code
,否则一切都很顺利。
下面是我用来打印 json 格式数据的函数。我根据需要使用的错误代码(200、404、400、401 等)设置了http_response_code()
。
<?php
public function handle($code = 200, $data = array())
$message = json_encode(
array(
"code" => $code,
"data" => $data
), JSON_PRETTY_PRINT
);
http_response_code($code);
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: *");
header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE");
header('Content-type: text/javascript; charset=utf-8');
print_r($message);
exit;
前端,我使用jQuery
进行简单的Ajax
调用。我认为它不需要任何解释,但为了完整起见,我把它放在了这里。
$.ajax(
url: url,
method: method,
cache: false,
headers: headers,
data: data,
crossDomain: true,
success: function(data)
console.log(data)
,
error: function (xhr, ajaxOptions, thrownError)
console.log((xhr.responseJSON)
);
问题是这样的。如果在 PHP
脚本中我注释行 http_response_code($code);
一切正常,但我总是收到状态码 200。
如果我尝试更改状态代码,无论是 200 还是任何其他代码,客户端都会响应以下错误:
Access to XMLHttpRequest at 'MY API URL CENSORED' from origin 'http://localhost:8080' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.
正如你所看到的php
和js
方面我已经启用了跨域并启用了所有跨域。我真的不明白为什么它会给我这个错误,除非我添加这一行http_response_code($code)
。
我做错了吗?更改状态代码是否会对 cors
策略产生任何问题?
【问题讨论】:
史蒂夫 - 你的$.ajax
电话中的 headers
是什么?
header('Content-type: text/javascript; charset=utf-8'); print_r($message);
没有意义。你输出的是 JSON,而不是 JavaScript ……print_r
用于输出复杂的数据结构而不是简单的字符串。
crossDomain: true,
抑制了 jQuery 添加到同源请求的功能,因此当同源请求被重定向到不同源时,它们不会导致问题。这几乎总是毫无意义的。
【参考方案1】:
我是不是做错了什么?
关于您提出的请求的某些内容(不清楚可能触发此请求的所有内容都隐藏在您未共享的变量后面)需要preflight request。
因此,浏览器会发出一个 OPTIONS 请求,请求获得发出实际(例如 POST)请求的权限。
您似乎正在响应 preflight 请求,就好像它是实际请求一样。
更改状态代码是否会对 cors 策略产生任何类型的问题?
是的。对预检请求的响应必须(如错误消息所述)具有200 OK
状态,以便浏览器接受已授予发出实际请求的权限。
对实际请求的响应可以具有您喜欢的任何状态。
您可以通过测试if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS')
来区分它们
【讨论】:
这听起来很可能。不错! 这实际上解决了问题。if($_SERVER['REQUEST_METHOD'] == 'GET' || $_SERVER['REQUEST_METHOD'] == 'POST')http_response_code($code);
。不知道浏览器会先发出请求选项以上是关于Cors 策略错误:它没有 HTTP ok 状态的主要内容,如果未能解决你的问题,请参考以下文章
domain.com 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:它没有 HTTP ok 状态
Nuxt.js CORS 错误:它没有 HTTP ok 状态
被 CORS 策略阻止:对预检的响应...没有 HTTP ok 状态。标头没有解决问题
CORS 错误:对预检请求的响应未通过访问控制检查:它没有 HTTP ok 状态
尝试从 Web 应用程序获取数据时出现 Cors 错误(没有“访问控制允许来源”/它没有 HTTP ok 状态。)
React Express Fetch Post CORS 错误:对预检请求的响应未通过访问控制检查:它没有 HTTP ok 状态