Qia*_*hen 367 http options cors
我正在构建一个Web API.我发现每当我使用Chrome进行POST,GET到我的API时,总会在真实请求之前发送OPTIONS请求,这非常烦人.目前我让服务器忽略任何OPTIONS请求.现在我的问题是发送OPTIONS请求以加倍服务器负载是什么好事?有没有办法完全阻止浏览器发送OPTIONS请求?
Leo*_*rea 339
编辑2018-09-13:增加了关于此飞行前请求的一些准确性以及如何在此响应结束时避免它.
OPTIONS请求是我们称之为的pre-flight请求Cross-origin resource sharing (CORS).
当您在特定情况下跨不同来源提出请求时,它们是必需的.
某些浏览器将此飞行前请求作为安全措施,以确保服务器信任所完成的请求.这意味着服务器了解在请求上发送的方法,来源和标头是安全的.
当您尝试执行跨源请求时,您的服务器不应忽略但处理这些请求.
这里有一个很好的资源http://enable-cors.org/
处理这些以使其变得舒适的一种方法是确保对于具有OPTIONS方法的任何路径,服务器使用此标头发送响应
Access-Control-Allow-Origin: *
这将告诉浏览器服务器愿意回答来自任何来源的请求.
有关如何向服务器添加CORS支持的更多信息,请参阅以下流程图
http://www.html5rocks.com/static/images/cors_server_flowchart.png

编辑2018-09-13
CORS OPTIONS请求仅在某些情况下触发,如MDN文档中所述:
有些请求不会触发CORS预检.这些在本文中称为"简单请求",尽管Fetch规范(定义CORS)不使用该术语.不触发CORS预检的请求 - 所谓的"简单请求" - 满足以下所有条件的请求:
唯一允许的方法是:
- 得到
- 头
- POST
除了由用户代理自动设置的标头(例如,连接,用户代理或任何其他标头,其中名称在Fetch规范中定义为"禁用标头名称")之外,唯一允许的标头手动设置是Fetch规范定义为"CORS-safelisted request-header"的那些,它们是:
- 接受
- 接受语言
- 内容语言
- 内容类型(但请注意下面的附加要求)
- DPR
- 下行
- 保存数据
- 视口宽度
- 宽度
Content-Type标头唯一允许的值是:
- 应用程序/ x-WWW窗体-urlencoded
- 多部分/格式数据
- 纯文本/
在请求中使用的任何XMLHttpRequestUpload对象上都没有注册事件侦听器; 这些是使用XMLHttpRequest.upload属性访问的.
请求中不使用ReadableStream对象.
Nee*_*key 213
经历过这个问题,下面是我对这个问题和我的解决方案的结论.
根据CORS策略(强烈建议你阅读它)你不能强迫浏览器停止发送OPTION请求,如果它认为需要.
有两种方法可以解决它
Access-Control-Max-Age为OPTION请求设置一个简单的跨站点请求是满足以下所有条件的请求:
唯一允许的方法是:
除了用户代理自动设置的标头(例如Connection,User-Agent等)之外,允许手动设置的唯一标头是:
Content-Type标头唯一允许的值是:
简单的请求不会导致飞行前的OPTION请求.
您可以Access-Control-Max-Age为OPTION请求设置一个,以便它在过期之前不会再次检查权限.
Access-Control-Max-Age以秒为单位给出了在不发送其他预检请求的情况下可以缓存对预检请求的响应的时间长度的值.
小智 139
请参考这个答案,了解预先确定的OPTIONS请求的实际需求:CORS - 引入预检请求背后的动机是什么?
要禁用OPTIONS请求,必须满足以下条件:ajax请求:
application/x-www-form-urlencoded,multipart/form-data或text/plain参考:https: //developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
Nir*_*Nir 46
打开调试控制台并打开Disable Cache选项后,将始终发送预检请求(即在每个请求之前).如果您不禁用缓存,则只会发送一次飞行前请求(每台服务器)
use*_*349 41
是的,可以避免选项请求.当您将任何数据发送(发布)到另一个域时,选项请求是预检请求.这是一个浏览器安全问题.但我们可以使用另一种技术:iframe传输层.我强烈建议您忘记任何CORS配置并使用现成的解决方案,它可以在任何地方使用.
看看这里:https: //github.com/jpillora/xdomain
工作示例:http: //jpillora.com/xdomain/
祝你今天愉快!
Jos*_*nke 15
对于了解其存在的原因但需要访问不使用auth处理OPTIONS调用的API的开发人员,我需要一个临时答案,以便我可以在本地开发,直到API所有者添加适当的SPA CORS支持或我获得代理API启动并运行.
我发现你可以在Safari上禁用CORS,在Mac上禁用Chrome.
Chrome:退出Chrome,打开终端并粘贴此命令: open /Applications/Google\ Chrome.app --args --disable-web-security --user-data-dir
Safari:在Safari中禁用同源策略
如果要在Safari上禁用同源策略(我有9.1.1),则只需启用开发人员菜单,然后从开发菜单中选择"禁用跨源限制".
enp*_*nax 14
正如之前的帖子中所提到的,OPTIONS请求是有原因的.如果您的服务器响应时间很长(例如海外连接),您也可以让浏览器缓存预检请求.
让您的服务器回复Access-Control-Max-Age标题,对于转到同一端点的请求,预检请求将被缓存而不再发生.
我已经解决了这个问题.
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();
}
Run Code Online (Sandbox Code Playgroud)
它只是为了发展.有了这个我等待9ms和500ms而不是8s和500ms.我可以这样做,因为生产JS应用程序将与生产在同一台机器上,所以没有,OPTIONS但开发是我的本地.
你不能但是你可以使用JSONP来避免使用CORS.
| 归档时间: |
|
| 查看次数: |
354194 次 |
| 最近记录: |