导致PREFLIGHT的HTTP标头 - 澄清?

时间:2015-09-26 09:11:03

标签: http http-headers cors preflight

简单请求是符合以下条件的请求:

  • HTTP方法匹配(区分大小写)以下之一:

    • HEAD
    • GET
    • POST
  • HTTP标头匹配(不区分大小写):

    • 接受
    • 接受语言
    • 内容的语言
    • 最后-事件ID
    • Content-Type,但仅当值为以下值之一时:
      • 应用程序/ x-WWW窗体-urlencoded
      • 的multipart / form-data的
      • 文本/纯

但是看看这个test page不会导致预检请求:

一般:

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

请求标题

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

响应标题

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部分,前面的条件部分中有许多标题

  • Cache-Control 不在列表中
  • Connection 不在列表中
  • DNT 不在列表中
  • User-Agent 不在列表中
  • Accept-Encoding 不在列表中

我知道那些更多的是"一般"头。 accept-language

也是如此

问题

我在这里缺少什么?根据条件部分,带有标题的请求会导致预检请求。

2 个答案:

答案 0 :(得分:2)

查看您的代码:

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

您实际上并未设置任何自定义标头。 e.g。

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

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

答案 1 :(得分:2)

在接受的答案之上进一步说明:请参阅HTTP header layer divisionFetch Standard部分(这些天定义了CORS协议和UA要求)。

  

为了获取,平台有一个API层(HTML' s   img,CSS' background-image),早期获取层,服务工作者层,   和网络&缓存层。设置了AcceptAccept-Language   早期获取层(通常由用户代理)。大多数其他   由用户代理控制的标头,例如Accept-Encoding,   HostReferer已设置在网络&缓存层。   开发人员可以在API层或服务中设置标头   工作层(通常通过Request对象)。

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

  • 问题中的标题由UA控制,并设置在“网络&缓存层“
  • 因此,标题不是开发人员可以在“API层”中设置的标题
  • 所以,当算法运行时,标题尚未设置,以确定是否需要预检请求(而不是之后由UA设置,之后已经完成)

然后,鉴于上述情况,尽管在请求中可以看到这些标题,但我们知道他们没有参与确定是否需要预检。

换句话说,这些标题基本上与CORS无关。同样, 相关的唯一标题是开发人员在“API层”或服务工作者层中手动设置的标题。