代码之家  ›  专栏  ›  技术社区  ›  Paul Draper

为什么跨源HEAD请求需要飞行前检查?

  •  14
  • Paul Draper  · 技术社区  · 11 年前

    我在读 spec 关于CORS请求,我发现这是关于飞行前请求的:

    这些是对具有HTTP请求的非同一源URL的请求 首先需要使用 飞行前结果缓存条目或飞行前请求。

    我以为飞行前请求的目的是在提出请求之前检查请求是否被允许, 以防(非法)更改服务器状态 .

    但是HEAD和OPTIONS不会修改服务器状态。我一定误解了飞行前检查的原因。

    对HEAD和OPTIONS而不是GET进行飞行前检查的目的是什么?GET有什么特别之处?

    1 回复  |  直到 11 年前
        1
  •  26
  •   Bergi    11 年前

    预照明的主要目的是确保服务器不会突然发送基于浏览器的跨源请求,这些请求在CORS规范实施之前可能从未收到过。

    在CORS规范之前,除了GET或POST之外,不可能发送任何基于浏览器的跨源请求。浏览器只是不允许您启动XHR实例,将方法设置为PUT(例如)并将其发送到不同来源的端点。您也不能通过XHR发送GET或POST跨源请求,但可以通过表单提交发送跨源GET或POST,或通过 <img> <script> 标记(这使得JSONP成为CORS之前的唯一选项)。一旦浏览器实现了CORS规范,这就改变了。现在,只要服务器选择,就可以发送任何跨源ajax请求。

    CORS规范定义了“简单”方法(GET和POST)以及“简单”请求头。这些对应于您已经可以从浏览器前CORS规范发送的跨源请求的类型。非简单的跨源要求,例如,带有X标头的PUT或POST/GET要求(例如),无法从浏览器前的CORS规范中发送。因此,对于这些类型的要求,预照明的概念被写入规范中,以确保服务器在没有明确选择的情况下不会接收这些类型的非简单的基于跨源浏览器的请求。换句话说,如果您不想允许这些类型的请求,则根本不必更改服务器。预飞行将失败,浏览器将永远不会发送底层请求。

    直接回答您的问题:HEAD请求通常不会导致预检。根据CORS规范,HEAD被认为是一种简单的请求方法。如您所知,HEAD请求只是没有响应负载的GET。这是HEAD和GET请求被相同对待的最可能原因,即使您无法从浏览器发送跨源HEAD请求预CORS。如果您的HEAD包含非简单的头,那么它将被预点燃,就像GET一样。