HTTP headers 导致 PREFLIGHT - 澄清?

HTTP headers which cause PREFLIGHT - Clarification?

简单 请求是满足以下条件的请求:

但是看看这个 test page 并没有引起 preflight 请求:

一般:

Remote Address:69.163.243.142:80
Request URL:http://aruner.net/resources/access-control-with-get/
Request Method:GET
Status Code:200 OK

请求Headers

Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8,he;q=0.6
Cache-Control:no-cache
Connection:keep-alive
DNT:1
Host:aruner.net
Origin:http://arunranga.com
Pragma:no-cache
Referer:http://arunranga.com/examples/access-control/simpleXSInvocation.html
User-Agent:Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36

响应Headers

Access-Control-Allow-Origin:http://arunranga.com
Connection:Keep-Alive
Content-Type:application/xml
Date:Sat, 26 Sep 2015 09:00:26 GMT
Keep-Alive:timeout=2, max=100
Server:Apache
Transfer-Encoding:chunked

迂腐地看request部分,有很多headers在前面的标准部分不是

我知道更多的是 "general" headers。 但是也是accept-language

问题

我在这里错过了什么?根据标准部分,带有 headers 的请求应该 导致预检请求。

查看您的代码:

    invocation.open('GET', url, true);
    invocation.onreadystatechange = handler;
    invocation.send(); 

您实际上并未设置任何自定义 headers。例如

    invocation.setRequestHeader("X-Requested-With", "XMLHttpRequest");

因此不会有预检。默认浏览器headers不算。预检机制仅用于确保接收站点允许跨域传递任何自定义 headers,例如我上面示例中的自定义。

作为对已接受答案的进一步说明:请参阅 HTTP header layer division section of the Fetch Standard(最近定义了 CORS 协议和 UA 要求)。

For the purposes of fetching, the platform has an API layer (HTML's img, CSS' background-image), early fetch layer, service worker layer, and network & cache layer. Accept and Accept-Language are set in the early fetch layer (typically by the user agent). Most other headers controlled by the user agent, such as Accept-Encoding, Host, and Referer, are set in the network & cache layer. Developers can set headers either at the API layer or in the service worker layer (typically through a Request object).

因此,基于此,我们基本上可以说:

  • 问题中的headers是由UA控制的,在“network & cache layer”中设置
  • 所以,headers并不是开发者可以在“API层”设置的headers
  • 因此,headers 尚未在算法运行时设置以确定是否需要预检请求(相反,它们由 UA 稍后设置,之后已经完成)

那么,鉴于上述情况,尽管在请求中可以看到那些 headers,但我们知道它们在确定是否需要预检方面没有发挥任何作用。

换句话说,那些headers本质上与CORS无关。同样,唯一与 相关的 headers 是开发人员在“API 层”或 service-worker 层中手动设置的那些。