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.

正如你所看到的phpjs 方面我已经启用了跨域并启用了所有跨域。我真的不明白为什么它会给我这个错误,除非我添加这一行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 状态