首页 > 解决方案 > 为什么会出现飞行前请求?

问题描述

如果我打开了另一个应用程序(不使用 CORS),我的 chrome 扩展有时可以正常工作。但有时浏览器扩展会发送一个飞行前请求,然后我的代码就不起作用了。

这是不幸发送预检时的请求标头:

OPTIONS /sub_crud/Subit_backend/register HTTP/1.1
Host: www.xxxxubstantiation.com
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Access-Control-Request-Method: POST
Origin: chrome-extension://xxxxlhfmhghjhbkkkaaammfocdpib
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
Access-Control-Request-Headers: content-type,x-requested-with
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9

我得到的错误是:

“已被 CORS 策略阻止:在预检响应中 Access-Control-Allow-Headers 不允许请求标头字段 x-requested-with。”

但我不想发送预检,也不知道为什么有时会发送预检。我想知道问题是否与预检请求和重定向有关?另外,这是设置请求的代码:

    xhr.open('POST', url, true);
//  xhr.setRequestHeader("Content-type", 'text/plain');
    xhr.setRequestHeader("Content-type", 'application/json');
    xhr.setRequestHeader("X-Requested-With",'xmlhttprequest');
//  xhr.setRequestHeader("Access-Control-Allow-Origin", '*');

我尝试使用 text/plain 作为内容类型,但这不起作用。我还注释掉了 access-control-allow-origin,但这没有用。

关于如何停止飞行前的任何想法?或者如果我无法停止预检,如何设置 Apache 来响应它?

附加信息************************ 1) 浏览器 js 代码和服务器代码 (CI) 都是我的。2)我真的不想要预检请求。因为我发送 type=application/json,所以浏览器决定将其设为 OPTION。3) 我的 PHP 函数没有被触发。我也有一个调试器。4)我修改了服务器上的 httpd.conf 以获得包括:

  Header set Access-Control-Allow-Origin "*"
  Header set Access-Control-Allow-Headers "Accept,Authorization,Content-Type,Origin"
  Header set Access-Control-Allow-Methods "GET, POST, PATCH, PUT, DELETE"
  Header set Access-Control-Max-Age: 86400

5)代码,浏览器扩展和服务器过去都工作过。

标签: cors

解决方案


在 CORS 中,发送带有 OPTIONS 方法的预检请求,以便服务器可以响应是否可以接受发送带有这些参数的请求。

有关http 方法的更多详细信息,请参阅链接。options

所以问题是您的服务器不允许 CORS 用于 header x-requested-with

xhr.setRequestHeader("X-Requested-With",'xmlhttprequest'); // here is the issue

现在,您可以评论此行,或者如果需要,则在您的服务器中允许此标头。

要在服务器中设置,您可以使用.htaccess文件


推荐阅读