Access-Control-Allow-Headers 头

Baseline 广泛可用 *

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

* 此特性的某些部分可能存在不同级别的支持。

HTTP Access-Control-Allow-Headers 响应头用于响应预检请求,指示在实际请求期间可以使用的 HTTP 头。如果预检请求包含 Access-Control-Request-Headers,则此头是必需的。

注意: CORS 安全列表请求头始终被允许,并且通常不会在 Access-Control-Allow-Headers 中列出,除非需要规避额外的安全列表限制

头类型 响应头
禁止请求头

语法

http
Access-Control-Allow-Headers: <header-name>
Access-Control-Allow-Headers: <header-name>, <header-name>
Access-Control-Allow-Headers: *

指令

<header-name>

支持的请求头的名称。该头可以列出任意数量的头,以逗号分隔。

* (通配符)

任意头。值 * 仅对于不带凭据的请求(不带 HTTP cookie 或 HTTP 认证信息的请求)作为特殊的通配符值。在带凭据的请求中,它被视为字面头名称 *,没有特殊语义。Authorization 头不接受通配符,并且始终需要明确列出。

示例

实现自定义头

下面是 Access-Control-Allow-Headers 头的一个示例。它指示服务器支持 CORS 请求中的自定义头 X-Custom-Header,此外还支持CORS 安全列表请求头

http
Access-Control-Allow-Headers: X-Custom-Header

支持多个头

此示例展示了 Access-Control-Allow-Headers 在指定支持多个头时的情况。

http
Access-Control-Allow-Headers: X-Custom-Header, Upgrade-Insecure-Requests

绕过 CORS 安全列表头的额外限制

尽管CORS 安全列表请求头始终被允许,并且通常不需要在 Access-Control-Allow-Headers 中列出,但无论如何列出它们将规避适用的额外限制

http
Access-Control-Allow-Headers: Accept

处理预检请求

让我们看一个涉及 Access-Control-Allow-Headers预检请求示例。

Request

首先,预检请求是一个 OPTIONS 请求,它包含以下三个预检请求头的某种组合:Access-Control-Request-MethodAccess-Control-Request-HeadersOrigin

下面的预检请求告诉服务器,我们希望发送一个 CORS GET 请求,其中包含 Access-Control-Request-Headers 中列出的头(Content-TypeX-Requested-With)。

http
OPTIONS /resource/foo
Access-Control-Request-Method: GET
Access-Control-Request-Headers: content-type,x-requested-with
Origin: https://foo.bar.org

Response

如果预检请求指示的 CORS 请求被授权,服务器将以包含允许的源、方法和头的消息响应预检请求。在下面,我们看到 Access-Control-Allow-Headers 包含了所请求的头。

http
HTTP/1.1 200 OK
Content-Length: 0
Connection: keep-alive
Access-Control-Allow-Origin: https://foo.bar.org
Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE
Access-Control-Allow-Headers: Content-Type, x-requested-with
Access-Control-Max-Age: 86400

如果请求的方法不受支持,服务器将响应错误。

规范

规范
Fetch
# http-access-control-allow-headers

浏览器兼容性

另见