HTTP headers 导致 PREFLIGHT - 澄清?
HTTP headers which cause PREFLIGHT - Clarification?
简单 请求是满足以下条件的请求:
HTTP 方法匹配(case-sensitive)之一:
- 头
- 得到
- POST
HTTP Headers 匹配 (case-insensitive):
- 接受
- Accept-Language
- Content-Language
- Last-Event-ID
- Content-Type,但前提是值为以下之一:
- application/x-www-form-urlencoded
- multipart/form-data
- text/plain
但是看看这个 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在前面的标准部分不是:
Cache-Control
不在列表中
Connection
不在名单中
DNT
不在不在列表中
User-Agent
不在名单中
Accept-Encoding
不在名单中
我知道更多的是 "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 层中手动设置的那些。
简单 请求是满足以下条件的请求:
HTTP 方法匹配(case-sensitive)之一:
- 头
- 得到
- POST
HTTP Headers 匹配 (case-insensitive):
- 接受
- Accept-Language
- Content-Language
- Last-Event-ID
- Content-Type,但前提是值为以下之一:
- application/x-www-form-urlencoded
- multipart/form-data
- text/plain
但是看看这个 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在前面的标准部分不是:
Cache-Control
不在列表中Connection
不在名单中DNT
不在不在列表中User-Agent
不在名单中Accept-Encoding
不在名单中
我知道更多的是 "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
andAccept-Language
are set in the early fetch layer (typically by the user agent). Most other headers controlled by the user agent, such asAccept-Encoding
,Host
, andReferer
, are set in the network & cache layer. Developers can set headers either at the API layer or in the service worker layer (typically through aRequest
object).
因此,基于此,我们基本上可以说:
- 问题中的headers是由UA控制的,在“network & cache layer”中设置
- 所以,headers并不是开发者可以在“API层”设置的headers
- 因此,headers 尚未在算法运行时设置以确定是否需要预检请求(相反,它们由 UA 稍后设置,之后已经完成)
那么,鉴于上述情况,尽管在请求中可以看到那些 headers,但我们知道它们在确定是否需要预检方面没有发挥任何作用。
换句话说,那些headers本质上与CORS无关。同样,唯一与 相关的 headers 是开发人员在“API 层”或 service-worker 层中手动设置的那些。