为什么会发生飞行前请求?

时间:2019-01-23 08:46:03

标签: cors

如果我打开了另一个我的应用程序(不使用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策略阻止:“请求标头”字段   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)代码,浏览器扩展程序和服务器在过去都可以使用。

1 个答案:

答案 0 :(得分:1)

  

在CORS中,将使用OPTIONS方法发送预检请求,以便服务器可以响应是否可以使用这些参数发送请求。

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

因此问题是您的服务器不允许标题x-requested-with的CORS。

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

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

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