【发布时间】: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: 864005) 代码,浏览器扩展和服务器在过去都工作过。
【问题讨论】:
-
使用非CORS-safelisted request headers 会导致预检请求,并且
application/json的 Content-Type 也会这样做。 // 您的服务器必须使用Access-Control-Allow-Headers响应标头来回答此 OPTIONS 请求,这允许使用该x-requested-with标头发出真正的请求。 -
感谢误会。我将除内容类型之外的所有标题注释为文本/纯文本,这似乎摆脱了预检。但是如何获得 json 响应呢?
-
“但是如何获得 json 响应?” - 通过使您的服务器端脚本 respond 使用 JSON ...?
Content-typerequest 标头指定您发送的数据格式,而不是您将得到的数据。
标签: cors