【问题标题】:why is a pre-flight request occurring?为什么会出现飞行前请求?
【发布时间】:2019-06-16 19:16:56
【问题描述】:

如果我打开了另一个应用程序(不使用 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,得到了include:

  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-safelisted request headers 会导致预检请求,并且application/json 的 Content-Type 也会这样做。 // 您的服务器必须使用 Access-Control-Allow-Headers 响应标头来回答此 OPTIONS 请求,这允许使用该 x-requested-with 标头发出真正的请求。
  • 感谢误会。我将除内容类型之外的所有标题注释为文本/纯文本,这似乎摆脱了预检。但是如何获得 json 响应呢?
  • “但是如何获得 json 响应?” - 通过使您的服务器端脚本 respond 使用 JSON ...? Content-type request 标头指定您发送的数据格式,而不是您将得到的数据。

标签: cors


【解决方案1】:

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

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

所以问题是您的服务器不允许标头 x-requested-with 的 CORS。

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

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

服务器设置可以使用.htaccess文件

【讨论】:

  • 感谢 hvish。我正在进行 bitnami 设置,他们已重命名 .htaccess,所以我需要他们告诉我在哪里允许 prfilght 响应。
猜你喜欢
  • 2014-01-21
  • 2016-01-25
  • 2018-10-19
  • 2017-01-22
  • 2014-02-07
  • 2016-06-28
  • 2015-06-01
  • 2023-03-26
  • 1970-01-01
相关资源
最近更新 更多