【问题标题】:how to control the response to a pre-flight request如何控制对飞行前请求的响应
【发布时间】:2019-06-17 06:40:20
【问题描述】:

我的浏览器正在向我的服务器发送数据缓冲区。不幸的是,我使用 POST 将 requestHeader 设置为 xhr.setRequestHeader("Content-type", 'application/json') 。这是因为我在浏览器代码中使用这个 var json = JSON.stringify(myArray) 来创建一个 json 缓冲区。所以我几乎无法发送飞行前请求(由于我使用了应用程序/json)。现在我在我的扩展程序窗口中收到一个错误:

Access to XMLHttpRequest at 
'https://www.xxxubstantiation.com/xxx_crud/xxxit_backend/register' from 
origin 'chrome-extension://xxxgnodlhfmhghjhbkkkaaammfocdpib' has been 
blocked by CORS policy: Request header field content-type is not allowed by 
Access-Control-Allow-Headers in preflight response.

所以我认为我需要清理预检响应,但我不知道它来自哪里。我在 Bitnami 的支持人员告诉我,我可以将以下行放入 https.conf 文件:

标头集 Access-Control-Allow-Origin "*"

但我已经有了,我没有看到我在预检响应中设置任何内容类型。预检响应在哪里设置,我该如何删除或修复它?有没有关于如何(又名在哪里)配置飞行前响应的文档?

【问题讨论】:

  • 这取决于你的服务器。

标签: cors


【解决方案1】:

服务器需要在 Header 中响应以下内容:

Access-Control-Allow-Headers: content-type
Access-Control-Allow-Method: POST
Access-Control-Allow-Origin: *

响应应该是 HTTP 200。 第一个标头是与您收到的错误消息相对应的标头,然后应该消失...

--- 扩展答案---

检查 OPTIONS 响应的标头:

我想您需要检查 OPTIONS 请求是否真的发回所有必需的标头以成功处理预检。因此,要查看 OPTION 请求的标头,您可以模拟它:

curl  -i \
  -H "Origin: http://your-calling-domain.com/" \
  -H "Access-Control-Request-Method: GET" \
  -H "Access-Control-Request-Headers: X-Requested-With" \
  -X OPTIONS \
  https://the-api-endpoint-you-want-to-call/... \

这里是 github api 的示例:

curl  -i \
  -H "Origin: http://your-calling-domain.com/" \
  -H "Access-Control-Request-Method: GET" \
  -H "Access-Control-Request-Headers: X-Requested-With" \
  -X OPTIONS \
  https://api.github.com/users/sebhildebrandt/org \

您的 OPTION REQUEST 需要与 RESPONSE 标头匹配...更具体地说:

  • Access-Control-Request-Method 需要匹配(是其中之一)Access-Control-Allow-Method
  • Access-Control-Request-Headers 需要与Access-Control-Allow-Headers 匹配(是其中之一)
  • Origin需要匹配Access-Control-Allow-Origin

只有当这三个都正常时,预检才会成功,您的 POST 请求才会被触发到服务器。

在 Apache 上启用 CORS 标头:

在您的配置文件(为您的站点)或 .htaccess 中您需要添加

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

在这种情况下,预检有效期为一天(86400 秒)

那么你需要确保在 apache(基于 linux 的系统)上启用标头:

sudo a2enmod headers

对于 Windows,您需要:

  • 在您的_apache_folder_/conf 处打开httpd.conf
  • 取消评论#LoadModule headers_module modules/mod_headers.so

重启 Apache

sudo service apache2 restart

这应该可以解决问题...

【讨论】:

  • 我将这三个添加到 httpd.conf 的底部,重新启动了 apache,但仍然遇到同样的错误。什么是控制预检响应?
  • @Richard Bernstein:你运行的是哪个操作系统?
  • 我正在运行 linux。顺便说一句,我搞定了。您在 .Access 中设置预检响应的帮助非常有用。谢谢!似乎在浏览器中打开来自同一域的另一个页面隐藏了问题,因为这抑制了预检。
猜你喜欢
  • 1970-01-01
  • 2022-01-24
  • 2019-11-13
  • 2016-06-28
  • 1970-01-01
  • 2014-02-07
  • 2014-03-25
  • 2012-05-06
  • 2023-03-13
相关资源
最近更新 更多