首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何控制对飞行前请求的响应

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

Stack Overflow用户
提问于 2019-01-23 16:03:54
回答 1查看 501关注 0票数 0

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

代码语言:javascript
复制
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文件中:

标题设置访问-控制-允许-原产地"*“

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-23 16:08:43

服务器需要在标题中使用以下内容进行响应:

代码语言:javascript
复制
Access-Control-Allow-Headers: content-type
Access-Control-Allow-Method: POST
Access-Control-Allow-Origin: *

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

-延伸的答案

检查选项响应的标题:

我猜您需要检查选项请求是否真的发送回所有所需的头,以成功地处理预飞行。因此,要查看选项请求的头部,可以使用模拟

代码语言:javascript
复制
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的一个示例:

代码语言:javascript
复制
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 \

您的选项请求需要与响应头匹配.更具体而言:

  • 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中,您需要添加

代码语言:javascript
复制
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的系统)上启用报头:

代码语言:javascript
复制
sudo a2enmod headers

对于Windows,您需要:

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

重新启动Apache

代码语言:javascript
复制
sudo service apache2 restart

这应该能行..。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54331218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档