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 策略阻止:在预检响应中 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 以获得包括:
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 中,发送带有 OPTIONS 方法的预检请求,以便服务器可以响应是否可以接受发送带有这些参数的请求。
有关http 方法的更多详细信息,请参阅此链接。options
所以问题是您的服务器不允许 CORS 用于 header x-requested-with
。
xhr.setRequestHeader("X-Requested-With",'xmlhttprequest'); // here is the issue
现在,您可以评论此行,或者如果需要,则在您的服务器中允许此标头。
要在服务器中设置,您可以使用.htaccess
文件
推荐阅读
- google-sheets - 每月将 Google 电子表格中的特定工作表/标签保存到文件夹中
- python - 如何使用键绑定和按钮命令运行 tkinter 函数?
- bash - 安装 haskell 时遇到问题:如何调整 PATH 变量以添加到 shell 配置文件?
- java - Hibernate 延迟属性加载。使用@DynamicUpdate 进行误报字段检测
- java - 多态数组排序中的转换错误
- c# - 如何使用 Ajax 将数字列表从网页发送到服务器
- r - 在R中创建位置的窗口间隔
- docker - 更改根目录后,docker build 权限被拒绝
- linux - 使用 systemd 插入 USB 驱动器时如何触发脚本
- django - TypeError:字段“价格”需要一个数字,但得到了