【问题标题】:Default value for Access-Control-Allow-Methods访问控制允许方法的默认值
【发布时间】:2013-12-27 00:23:19
【问题描述】:

我刚刚了解了Access-Control-Allow-Methods 标头,例如

Access-Control-Allow-Methods: OPTIONS, HEAD, GET

我从未使用过此标头(只是 Access-Control-Allow-Origin),但我过去曾让 CORS 工作。

是默认允许所有方法,还是因为未定义的行为而幸运?

【问题讨论】:

  • 这似乎是一件非常好的事情,可以让 浏览器 阻止不必要的请求干扰您的网络服务器。

标签: http header cross-domain cors


【解决方案1】:

澄清一下,Access-Control-Request-Method 是浏览器在 CORS 预检请求上设置的请求标头,它只能有一个值。 Access-Control-Allow-Methods 标头是 CORS 响应标头,它可以有多个值。我假设您询问的是 Access-Control-Allow-Methods,因为这是服务器指定的值。

Access-Control-Allow-Methods 标头指示在特定端点上允许哪些 HTTP 方法用于跨域请求。如果您允许所有 HTTP 方法,则可以将值设置为 Access-Control-Allow-Methods: GET, PUT, POST, DELETE, HEAD 之类的值。但是,如果您想将端点限制为仅几个方法,则应仅包含这些方法。

至于为什么您以前没有看到过这个,这个标头仅用于 CORS 预检请求。也许您的应用程序没有使用 CORS 预检,然后发生更改以触发预检。您的应用程序是否使用 GET/POST 以外的任何 HTTP 方法或任何自定义 HTTP 标头?

您可以在此处了解有关 CORS 预检请求的更多信息:http://www.html5rocks.com/en/tutorials/cors/

【讨论】:

  • 感谢指正。澄清一下,CORS 仍然确实有效。我想知道我是否需要它,在某些情况下我没有测试。
  • 回答了我的问题:“此标头仅用于 CORS 预检请求”。
  • 在哪里可以看到这些标头的值?在我的情况下,我需要在标头中发送一个令牌,但我只能看到名称而不是值
  • 就像我看到类似 Access-Control-Request-Headers: dauth,content-type 的东西。 Dauth @monsur@paul 没有价值
【解决方案2】:

Access-Control-Allow-Methods 的默认设置是允许通过所有简单方法,即使是在预检请求中也是如此。正如https://www.w3.org/TR/cors/#preflight-request 上的流程所说(成功预检请求的第 7 步):

如果请求方法与 methods 中的任何方法都不区分大小写并且不是简单方法,则应用缓存和网络错误步骤。

简单方法的定义是:

如果一个方法是区分大小写的匹配以下之一,则称该方法为简单方法:GET HEAD POST

因此,如果您有一个预检的 POST 请求(例如,由于自定义 HTTP 标头),并且不发送 Access-Control-Allow-Methods 响应标头,则该请求仍会继续进行。

【讨论】:

  • 为了对读者稍微明确一点,PATCH、DELETE 和 PUT 不被视为简单方法。有趣的是,我发现浏览器的处理方式不一致。当Access-Control-Allow-Methods 标头被省略时,Chrome 选择允许这些方法,而 Firefox 不允许
  • Chrome 允许PATCH 等将是一个错误,您有示例/您报告了吗?我似乎无法在这里重现它。
  • 在 Chrome 中我得到例如var xhr = new XMLHttpRequest(); xhr.open("GET", "https://mapit.mysociety.org/area/2514", true); xhr.send(); - 工作正常(站点不返回 A-C-A-M 标头)。但是var xhr = new XMLHttpRequest(); xhr.open("PATCH", "https://mapit.mysociety.org/area/2514", true); xhr.send(); 给出错误:Method PATCH is not allowed by Access-Control-Allow-Methods in preflight response.
  • 啊,我实际上是发送 Access-Control-Allow-Methods: * 作为在 Chrome 中接受但在 Firefox 中不接受的标头。规范似乎不允许使用星号。
  • 规范允许,但尚未在所有浏览器中实现。错误问题链接见developer.mozilla.org/en-US/docs/Web/HTTP/Headers/… 结尾(在 63 中添加到 Chrome)。
猜你喜欢
  • 2020-04-24
  • 2015-05-13
  • 2019-12-15
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
  • 2018-03-18
  • 2019-07-09
  • 2015-08-30
相关资源
最近更新 更多