为什么发送OPTIONS请求,我可以禁用它?
我正在构build一个web api。 我发现每当我使用Chrome POST,GET到我的API,总是有一个OPTION请求发送之前的真正的请求,这是很烦人的。 目前我得到的服务器忽略任何OPTIONS请求。 现在我的问题是发送一个OPTION请求来加倍服务器的负载是好的吗? 有没有办法完全停止浏览器发送OPTIONS请求?
OPTIONS
请求就是我们所说的Cross-origin resource sharing (CORS)
pre-flight
请求。
当您在特定情况下针对不同来源提出请求时,这是必要的。
这个飞行前请求是由一些浏览器作为一种安全措施,以确保请求完成是由服务器信任。 这意味着服务器明白在请求上发送的方法,起源和标头是安全的。
您的服务器不应该忽略,只要您尝试执行跨源请求,就要处理这些请求。
一个很好的资源可以在这里findhttp://enable-cors.org/
处理这些问题以获得舒适的方法是确保对于任何具有OPTIONS
方法的path,服务器都会发送一个带有这个头的响应
Access-Control-Allow-Origin: *
这将告诉浏览器服务器愿意回答任何来源的请求。
有关如何将CORS支持添加到服务器的更多信息,请参阅以下stream程图
http://www.html5rocks.com/statichttp://img.dovov.comcors_server_flowchart.png
请参考这个答案的实际需要预先select的OPTIONS请求: CORS – 引入预检请求的动机是什么?
要禁用OPTIONS请求,下面的条件必须满足ajax请求:
- 请求不设置像'application / xml'或'application / json'等自定义HTTP头
- 请求方法必须是GET,HEAD或POST之一。 如果POST,内容types应该是
application/x-www-form-urlencoded
,multipart/form-data
或text/plain
参考: https : //developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
是的,可以避免选项请求。 选项请求是在将任何数据发送(发布)到另一个域时的预检请求。 这是一个浏览器安全问题。 但是我们可以使用另一种技术:iframe传输层。 我强烈build议你忘记任何CORSconfiguration,并使用现成的解决scheme,它可以在任何地方工作。
看看这里: https : //github.com/jpillora/xdomain
和工作示例: http : //jpillora.com/xdomain/
祝你今天愉快!
已经经历了这个问题,下面是我对这个问题和我的解决scheme的结论。
根据CORS策略 (强烈build议您阅读它)不能只是强制浏览器停止发送OPTION请求,如果它认为需要的话。
有两种方法可以解决这个问题
-
- 确保你的请求是一个“简单的请求”
-
- 为OPTION请求设置
Access-Control-Max-Age
- 为OPTION请求设置
简单的要求
一个简单的跨站点请求是一个满足以下所有条件的请求:
唯一允许的方法是: – GET – HEAD – POST
除了由用户代理(例如连接,用户代理等)自动设置的报头以外,允许手动设置的唯一报头是: – 接受 – 接受 – 语言 – 内容 – 语言 – 内容types
Content-Type头唯一允许的值是: – application / x-www-form-urlencoded – multipart / form-data – text / plain
一个简单的请求将不会导致飞行前OPTION请求。
为OPTION检查设置一个caching
您可以为OPTION请求设置一个Access-Control-Max-Age
,以便在它过期之前不会再次检查权限。
Access-Control-Max-Age以秒为单位给出可以caching对预检请求的响应多长时间的值,而不发送其他预检请求。
打开debugging控制台并打开“ Disable Cache
选项时,将始终发送预检请求。
正如前面的post中提到的, OPTIONS
请求是有原因的。 如果您的服务器响应时间较长(例如,海外连接),您也可以让浏览器caching预检请求。
让您的服务器使用Access-Control-Max-Age
标题进行回复,对于前往相同端点的请求,预检请求将被caching,不再发生。
对于了解其存在的原因但需要访问不经过授权的API调用的API的开发人员,我需要一个临时答案,以便我可以在本地进行开发,直到API所有者添加适当的SPA CORS支持,或者获得代理API启动和运行。
我发现你可以在Mac和Safari上禁用CORS。
在Chrome中停用相同的原产地策略
Chrome:退出Chrome浏览器,打开terminal并粘贴以下命令: open /Applications/Google\ Chrome.app --args --disable-web-security --user-data-dir
Safari: 禁用 Safari中的同源策略
如果要在Safari(我有9.1.1)上禁用同源策略,则只需启用开发人员菜单,然后从开发菜单中select“禁用跨源限制”即可。
你不能,但你可以避免使用JSONP的CORS。
我已经解决了这个问题。
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(); }
这只是为了发展。 有了这个我等待9ms和500ms,而不是8s和500ms。 我可以这样做,因为生产JS应用程序将与生产在同一台机器上,所以不会有OPTIONS
但开发是我的本地。
对我有用的是导入“github.com/gorilla/handlers”,然后用这种方式:
router := mux.NewRouter() router.HandleFunc("/config", getConfig).Methods("GET") router.HandleFunc("/config/emcServer", createEmcServers).Methods("POST") headersOk := handlers.AllowedHeaders([]string{"X-Requested-With", "Content-Type"}) originsOk := handlers.AllowedOrigins([]string{"*"}) methodsOk := handlers.AllowedMethods([]string{"GET", "HEAD", "POST", "PUT", "OPTIONS"}) log.Fatal(http.ListenAndServe(":" + webServicePort, handlers.CORS(originsOk, headersOk, methodsOk)(router)))
一旦我执行了一个Ajax POST请求并将JSON数据附加到它,Chrome会始终添加不在我以前的AllowedHeadersconfiguration中的Content-Type标头。
看起来您可以通过在请求中发送授权标头来避开它:
Authorization: sometoken
我曾经使用过的一个解决scheme – 可以说你的网站在mydomain.com上,你需要向foreigndomain.com发出一个ajax请求
configuration从您的域到外部域的IIS重写 – 例如
<rewrite> <rules> <rule name="ForeignRewrite" stopProcessing="true"> <match url="^api/v1/(.*)$" /> <action type="Rewrite" url="https://foreigndomain.com/{R:1}" /> </rule> </rules> </rewrite>
在你的mydomain.com网站 – 你可以做出一个相同的来源请求,并且不需要任何选项请求:)