Http 浏览器何时发送源标题?浏览器何时将原点设置为空?

Http 浏览器何时发送源标题?浏览器何时将原点设置为空?,http,firefox,cors,cross-domain,fetch-api,Http,Firefox,Cors,Cross Domain,Fetch Api,正如您从(和)中看到的,Firefox并不总是在POST请求中发送源标题。声明不应在某些未定义的“隐私敏感”上下文中发送。Mozilla定义了这些上下文 我想知道是否只有在这些情况下Firefox才会不发送源文件头。据我所知,它也不会在跨源POST请求中发送它(尽管Chrome和InternetExplorer会),但我无法在文档中确认这一点。是否列举了我遗漏的地方?根据相关规范的实际要求,答案有几个部分: 浏览器必须在内部将原点设置为一个值,该值将被序列化为null 当浏览器必须发送源标题时

正如您从(和)中看到的,Firefox并不总是在POST请求中发送源标题。声明不应在某些未定义的“隐私敏感”上下文中发送。Mozilla定义了这些上下文


我想知道是否只有在这些情况下Firefox才会不发送源文件头。据我所知,它也不会在跨源POST请求中发送它(尽管Chrome和InternetExplorer会),但我无法在文档中确认这一点。是否列举了我遗漏的地方?

根据相关规范的实际要求,答案有几个部分:

  • 浏览器必须在内部将原点设置为一个值,该值将被序列化为
    null
  • 当浏览器必须发送源标题时
详情如下:

当浏览器必须将origin设置为将被序列化为
null
HTML规范使用该术语并将其定义为“内部值”:

在没有序列化的情况下,可以从中重新创建它(它被序列化为“null”,每个源的ASCII序列化),对于它,唯一有意义的操作是测试是否相等

换言之,HTML规范所说的不透明原点的任何地方,您都可以将其转换为
null

HTML规范要求浏览器在以下情况下设置不透明原点或唯一原点:

  • Fetch规范要求浏览器将原点设置为“全局唯一标识符”(这基本上与“不透明原点”的含义相同,后者基本上表示
    null
    …):

  • URL规范要求浏览器在以下情况下设置不透明原点:

  • 但请注意,仅仅因为浏览器在内部设置了一个不透明的原点(本质上是
    null
    ),这并不一定意味着浏览器将发送一个
    原点
    标题。因此,有关浏览器何时必须发送
    Origin
    标题的详细信息,请参阅本答案的下一部分


    当浏览器必须发送源标题时 对于由
    fetch()
    或XHR调用启动的跨源请求,或通过JavaScript库(axios、jQuery等)中的ajax方法启动的跨源请求,浏览器会发送
    Origin
    头,但对于正常的页面导航(即,当您直接在浏览器中打开网页时),对于嵌入在网页中的资源,浏览器不会发送
    Origin头(例如,不适用于CSS样式表、脚本或图像)

    但这种描述只是一种简化。当浏览器发送
    origin
    头时,除了跨源XHR/fetch/ajax调用外,还有一些情况是浏览器发送嵌入式资源的
    origin
    头。因此,下面是较长的答案


    就规范要求而言:规范要求仅针对Fetch规范定义为以下内容的任何请求发送
    Origin
    头:

    CORS请求是一个HTTP请求,它包含一个
    Origin
    头。由于
    Origin
    头也包含在方法既不是
    GET
    也不是
    HEAD
    的所有请求中,因此无法可靠地将其识别为参与CORS协议

    因此,规范的含义是:
    Origin
    头在所有跨源请求中发送,但它也总是针对所有
    POST
    PUT
    PATCH
    、和
    DELETE
    请求发送,即使是对于相同的Origin
    POST
    PUT
    PATCH
    、和
    DELETE请求(根据Fetch中的定义,这些请求实际上是“CORS请求”-即使它们的来源相同)


    浏览器必须发送
    Origin
    报头的其他情况是使用“CORS标志”集发出请求的任何情况,就HTTP(S)请求而言,该标志是无效的

    XHR总是将模式设置为
    cors
    。但是对于Fetch API,这些请求模式是可以使用
    Fetch(…)
    方法的init object参数的
    mode
    字段设置的:

    fetch("http://example.com", { mode: 'no-cors' }) // no Origin will be sent
    
    字体请求始终将模式设置为
    cors
    ,因此始终具有
    原始
    标题

    对于任何具有(又名“CORS setting attribute”)的元素,HTML规范要求浏览器将请求模式设置为
    CORS
    (并发送
    Origin
    标题)

    否则,对于嵌入式资源-任何具有URL属性的元素,这些URL会启动请求(
    、样式表、图像、媒体元素)-请求的模式默认为
    no cors
    ;由于这些请求是
    GET
    请求,这意味着,根据规范,浏览器不会为它们发送
    Origin

    当HTML表单元素启动
    POST
    请求时,那些
    POST
    s的模式也默认为
    no-cors
    ——就像嵌入式资源的模式默认为
    no-cors
    。然而,与
    no-cors
    模式
    GET
    请求嵌入式资源不同,浏览器发送对于那些从HTML表单元素启动的
    no-cors
    mode
    POST
    s的
    Origin
    标题

    原因是,如本答案前面所述,浏览器总是在所有
    POST
    PUT
    PATCH
    DELETE
    请求中发送
    Origin
    标题

    此外,为了此处的完整性和明确起见:对于导航,浏览器不发送
    Origin
    标题。也就是说,如果用户直接导航到资源-通过将URL粘贴到浏览器地址栏中,或通过跟踪来自另一个网站的链接