如何控制对飞行前请求的响应

时间:2019-01-23 16:03:55

标签: cors

我的浏览器正在向我的服务器发送数据缓冲区。不幸的是,我已经使用POST将requestHeader设置为xhr.setRequestHeader(“ Content-type”,'application / json')。这是因为我在浏览器代码中使用了var json = JSON.stringify(myArray)创建json缓冲区。因此,由于我使用了application / 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“ *”

但是我已经拥有了,而且我没有看到在飞行前响应中设置任何内容类型。飞行前响应在哪里设置,如何删除或修复它?是否有任何文件说明如何(在哪里)配置飞行前响应?

1 个答案:

答案 0 :(得分:0)

服务器需要在标头中做出以下响应:

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,您需要:

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

重新启动Apache

sudo service apache2 restart

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

相关问题