小编典典

为什么会发送 OPTIONS 请求,我可以禁用它吗?

all

我正在构建一个 Web API。我发现每当我使用 Chrome 发布、获取到我的 API 时,总是在真正的请求之前发送一个 OPTIONS
请求,这很烦人。目前,我让服务器忽略任何 OPTIONS 请求。现在我的问题是发送 OPTIONS
请求以使服务器负载加倍有什么好处?有什么方法可以完全阻止浏览器发送 OPTIONS 请求?


阅读 418

收藏
2022-03-11

共1个答案

小编典典

编辑 2018-09-13 :添加了一些关于此飞行前请求的精确度以及如何在此响应结束时避免它。

OPTIONSrequests 就是我们pre-flightCross-origin resource sharing (CORS).

当您在特定情况下跨不同来源提出请求时,它们是必要的。

某些浏览器发出此飞行前请求作为一种安全措施,以确保正在完成的请求受到服务器的信任。这意味着服务器知道在请求上发送的方法、来源和标头是安全的。

每当您尝试执行跨源请求时,您的服务器不应忽略而是处理这些请求。

可以在这里找到一个很好的资源http://enable-cors.org/

处理这些问题的一种方法是确保对于任何带有OPTIONS方法的路径,服务器都会发送带有此标头的响应

Access-Control-Allow-Origin: *

这将告诉浏览器服务器愿意回答来自任何来源的请求。

有关如何向服务器添加 CORS 支持的更多信息,请参阅以下流程图

http://www.html5rocks.com/static/images/cors_server_flowchart.png

CORS 流程图


编辑 2018-09-13

CORSOPTIONS请求仅在某些情况下触发,如MDN 文档中所述:

一些请求不会触发 CORS 预检。在本文中,这些被称为“简单请求”,尽管 Fetch 规范(定义 CORS)并未使用该术语。不触发 CORS
预检的请求,即所谓的“简单请求”,即满足以下所有条件的请求:

唯一允许的方法是:

  • 得到
  • 邮政

除了由用户代理自动设置的标头(例如,Connection、User-Agent 或任何其他标头,其名称在 Fetch 规范中定义为“orbidden
header name”),唯一允许的标头要手动设置的是 Fetch 规范定义为“ORS-safelisted request-
header”的那些,它们是:

  • 接受
  • 接受语言
  • 内容-语言
  • Content-Type(但请注意下面的附加要求)
  • 民主共和国
  • 下行链路
  • 保存数据
  • 视口宽度
  • 宽度

Content-Type 标头的唯一允许值是:

  • 应用程序/x-www-form-urlencoded
  • 多部分/表单数据
  • 文本/纯文本

请求中使用的任何 XMLHttpRequestUpload 对象上都没有注册事件侦听器;这些是使用 XMLHttpRequest.upload
属性访问的。

请求中没有使用 ReadableStream 对象。

2022-03-11