如何响应HTTP OPTIONS请求?


83

OPTIONS假定使用HTTP方法来确定服务器在给定资源上支持的其他方法。鉴于此,我有两个问题:

  • 此响应是什么样的?我在PublicAllow甚至Access-Control-Allow-Methods标题中都看到了带有CSV列表的示例。他们都需要吗?有什么不同? RFC 2616在这里似乎不是很有帮助。

  • 使用此列表列出资源在非REST-API环境中支持的操作是否合适?例如,如果我ConversionController支持action convert,这样的响应是否有意义:

请求:

OPTIONS /conversion HTTP/1.1

响应:

HTTP/1.1 200 OK
...
Allow: CONVERT
...

2
Allow: CONVERT??
佩里耶尔

Answers:


20

RFC 2616定义了“允许”(http://greenbytes.de/tech/webdav/rfc2616.html#rfc.section.14.7)。“公共”不再使用。在CORS规范中定义了“ Access-Control-Allow-Methods”(请参阅http://www.w3.org/TR/cors/)。


谢谢你的澄清。对于CORS,应同时发送AllowAccess-Control-Allow-Methods,还是仅发送后者?
FtDRbwLXw6 2012年

我将始终返回“允许”,因此不会返回特殊情况的CORS。
朱利安·瑞施

6
内容呢?是否可以提供身体内容?
CMCDragonkai 2014年

2
@CMCDragonkai是的,OPTIONS可能有内容。从RFC 2616开始:“如果OPTIONS请求包括一个实体(由Content-Length或Transfer-Encoding的存在指示),则媒体类型必须由Content-Type字段指示。尽管此规范未定义对于此类主体的任何使用,将来对HTTP的扩展都可能使用OPTIONS主体在服务器上进行更详细的查询。不支持此类扩展的服务器可能会丢弃请求主体。”
主教

我相信无论是AllowAccess-Control-Allow-Methods,如果你想使用CORS是必需的。前者指定一般支持哪些方法,后者指定跨域请求允许使用哪些方法。例如,您可能允许GETPOSTPUTDELETE为自己的出身,但只允许GETPOST跨起源。
Mikko Rantalainen

8

响应标题:“如何响应HTTP OPTIONS请求?” 要回答这个问题,我想知道为什么要回复OPTIONS请求?谁/什么向您发送OPTIONS请求,为什么? 许多公共服务器以某种形式的“错误”或“不允许”响应(500、501、405)。因此,除非您处在特定的情况下,您的客户将合理地发送OPTIONS请求并期望返回有用/有意义的信息(例如,WebDAV,CORS),否则您可能想回应:“不要这样做”。

就您对“ OPTIONS / conversion HTTP / 1.1”请求的问题而言:除非您知道服务器上有某些客户端,否则某个客户端会向“ / conversion”发送一个OPTIONS请求,并期望带有“允许:转换”的响应”的答案是否定的:如此回应就没有意义。我认为大多数确实支持OPTIONS并以“允许”响应的实现都以标准HTTP方法响应。

这是一篇有关该主题的好文章

简介:OPTIONS立即成为问题,因为它不支持缓存。备选方案:服务器范围的元数据:尝试使用知名的URI。特定于资源:尝试在其响应上使用Link标头,或对该资源使用表示形式的链接。

最后,如果您要提供的是服务描述,请查看WADLRSDL

编辑:

dotnetguy在下面的评论中指出了一个好观点:在某些情况下(例如,CORS),选项具有不可否认的价值;我当然不是要提出其他建议。


4
这篇文章是不错的,而且是权威人士,但请参见“为什么HTTPbis为何将OPTIONS留在其中”一节和注释。借助CORS,REST系统应该能够响应OPTIONS,尤其是要从基于JavaScript的Web应用程序中使用API​​时。JS框架通常在实际HTTP调用之前触发“预检”选项请求。
Sudhanshu Mishra

当我从macOS Finder(使用Webdav)连接(自写的)http服务器时,看到了OPTIONS请求。

7

什么是HTTP OPTIONS请求?

这是来自客户端的请求,知道什么HTTP方法服务器将允许一样GETPOST

请求

当询问特定资源的选项时,请求可能如下所示:

OPTIONS /index.html HTTP/1.1

或一般在询问服务器时是这样的:

OPTIONS * HTTP/1.1

响应

响应将包含Allow带有允许的方法的标头:

Allow: OPTIONS, GET, HEAD, POST

为什么服务器收到HTTP OPTIONS请求?

  • 一些REST API需要它(但是,如果您正在定义API,您会知道的)
  • 浏览器将其作为“预检”请求发送到服务器,以查看服务器是否理解CORS
  • 攻击者发送它以获取有关API的更多信息

如何响应HTTP OPTIONS请求?

  • 您可以使用Allowed标头进行响应,甚至可以在正文中记录您的API
  • 您可以使用其他CORS定义的Access-Control-Request-*标头进行响应。
  • 您可以用405 Method Not Allowed或回应501 Not Implemented

如何停止获取HTTP OPTIONS请求?

  • 如果它是从一个浏览器来然后更新您的API,因此它没有做任何“危险”(如PUTDELETE,或POSTapplication/json)。只执行简单的请求

也可以看看

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.