代码之家  ›  专栏  ›  技术社区  ›  David Jeong

浏览器不会为浏览器自动添加的某些标头发送CORS预检请求吗?

  •  1
  • David Jeong  · 技术社区  · 3 月前

    我正在使用JavaScript Fetch API 像这样: fetch(URL)

    我的浏览器(Chrome)似乎会自动添加 If-None-Match If-Modified-Since 请求的标头。虽然这些标头应该根据 fetch spec (我认为),没有发送飞行前请求。当浏览器自动添加此类标头而不是我将其添加到 fetch 功能?

    我注意到,当我添加时 如果没有匹配 如果修改自 将标题手动添加到 取来 功能,浏览器发送飞行前请求:

    fetch(cdnUrl, {
      "headers": {
        "If-None-Match": "blah"
      }
    })
    
    1 回复  |  直到 3 月前
        1
  •  1
  •   ADyson    3 月前

    https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests 表示要被归类为“简单”请求,从而避免触发飞行前请求,请求必须满足几个条件,包括以下条件:

    除了用户代理自动设置的标头(用于 例如,连接、用户代理或 the other headers defined in the Fetch spec as a forbidden header name ),唯一的标题是 允许手动设置的有 those which the Fetch spec defines as a CORS-safelisted request-header ,它们是:

    • 接受
    • 接受语言
    • 内容语言
    • 内容类型(请注意以下附加要求)
    • 范围(仅具有简单的范围标头值;例如,字节=256-或字节=127-255)

    注意短语

    除了用户代理自动设置的标头之外

    正如您所注意到的,浏览器自动设置的标头不算作触发飞行前请求,这是预期的行为。


    依我之见,如果浏览器设置的标头触发了飞行前请求,这对开发人员来说有点不公平——如果浏览器更新突然导致在获取请求中发送额外的标头,这可能会破坏现有的代码实现,从而导致服务器不期望的飞行前请求。我不确定,但这一点——再加上这样的标头是用户不可修改的,因此问题要小得多——会让我觉得这是这种行为的一个很好的理由。