我正在构建一个web API。我发现每当我使用Chrome POST, GET到我的API,总是有一个选项请求发送之前的真正的请求,这是相当恼人的。目前,我让服务器忽略任何OPTIONS请求。现在我的问题是,发送一个OPTIONS请求来增加服务器的负载有什么好处呢?有没有办法完全停止浏览器发送OPTIONS请求?
当前回答
对于一个理解它存在的原因,但需要访问一个没有认证就不能处理OPTIONS调用的API的开发人员,我需要一个临时的答案,这样我就可以在本地开发,直到API所有者添加适当的SPA CORS支持或我获得一个代理API并运行。
我发现你可以在Mac电脑的Safari和Chrome浏览器中禁用CORS。
在Chrome中禁用同源策略
Chrome:退出Chrome,打开终端并粘贴如下命令:open /Applications/谷歌\ Chrome。App——args——disable-web-security——user-data-dir
Safari:禁用Safari中的同源策略
如果你想在Safari上禁用同源策略(我有9.1.1),那么你只需要启用开发人员菜单,并从开发菜单中选择“禁用跨源限制”。
其他回答
在之前的文章中已经提到过,OPTIONS请求的存在是有原因的。如果您的服务器响应时间过长(例如海外连接),您也可以让浏览器缓存飞行前请求。
让你的服务器用Access-Control-Max-Age报头来回复,对于到达同一端点的请求,preflight请求将被缓存,不再发生。
已经讨论过这个问题,下面是我对这个问题的结论和我的解决方案。
根据CORS策略(强烈建议您阅读它),如果浏览器认为它需要停止发送OPTIONS请求,您不能仅仅强制浏览器停止发送OPTIONS请求。
有两种方法可以解决这个问题:
确保你的请求是“简单请求” 设置OPTIONS请求的Access-Control-Max-Age
简单的请求
一个简单的跨站点请求是一个满足以下所有条件的请求:
唯一允许的方法是:
得到 头 帖子
除了由用户代理(例如Connection, user - agent等)自动设置的头信息外,允许手动设置的头信息有:
接受 接收语言 内容语言 内容类型
Content-Type头唯一允许的值是:
应用程序/ x-www-form-urlencoded 多部分/格式 文本/平原
简单的请求不会引起飞行前选项请求。
为OPTIONS检查设置缓存
您可以为OPTIONS请求设置Access-Control-Max-Age,以便它在过期之前不会再次检查权限。
Access-Control-Max-Age给出了在不发送另一个preflight请求的情况下,对preflight请求的响应可以缓存的时间(以秒为单位)。
限制指出
对于Chrome, Access-Control-Max-Age的最大秒数是600,也就是10分钟,根据Chrome源代码 Access-Control-Max-Age每次只对一个资源有效,例如URL路径相同的GET请求,但不同的查询将被视为不同的资源。因此,对第二个资源的请求仍然会触发预飞行请求。
对于一个理解它存在的原因,但需要访问一个没有认证就不能处理OPTIONS调用的API的开发人员,我需要一个临时的答案,这样我就可以在本地开发,直到API所有者添加适当的SPA CORS支持或我获得一个代理API并运行。
我发现你可以在Mac电脑的Safari和Chrome浏览器中禁用CORS。
在Chrome中禁用同源策略
Chrome:退出Chrome,打开终端并粘贴如下命令:open /Applications/谷歌\ Chrome。App——args——disable-web-security——user-data-dir
Safari:禁用Safari中的同源策略
如果你想在Safari上禁用同源策略(我有9.1.1),那么你只需要启用开发人员菜单,并从开发菜单中选择“禁用跨源限制”。
我已经解决了这个问题。
if($_SERVER['REQUEST_METHOD'] == 'OPTIONS' && ENV == 'devel') {
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: X-Requested-With');
header("HTTP/1.1 200 OK");
die();
}
这只是为了发展。这样我就可以等待9毫秒和500毫秒,而不是8秒和500毫秒。我可以这样做,因为生产JS应用程序将在同一台机器上生产,所以没有选项,但开发是我的本地。
关于飞行前OPTIONS请求的实际需求,请参考以下答案:CORS -引入飞行前请求的动机是什么?
要禁用OPTIONS请求,ajax请求必须满足以下条件:
请求不设置自定义HTTP报头,如'application/xml'或'application/json'等 请求方法必须是GET、HEAD或POST中的一个。如果是POST,内容类型应该是application/x-www-form-urlencoded、multipart/form-data或text/plain
参考: https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
推荐文章
- 在ASP中设置Access-Control-Allow-OriginNet MVC -最简单的方法
- 什么是HTTP中的“406-不可接受的响应”?
- 最好的轻量级web服务器(只有静态内容)的Windows
- HTTP POST在Java中使用JSON
- 哪些HTTP方法与哪些CRUD方法相匹配?
- 使用HTML形式的PUT方法
- 如何转义哈希字符在URL
- 有没有办法在python中做HTTP PUT
- 跨源请求头(CORS)与PHP头
- 我能在服务器端应用程序(PHP、Ruby、Python等)上读取URL的哈希部分吗?
- 什么是http头“X-XSS-Protection”?
- 在nodejs http中body在哪里。得到回应?
- Ruby:如何将散列转换为HTTP参数?
- 在用nodejs和express创建的REST API中设置响应状态和JSON内容的正确方法
- 为跨源请求设置cookie