跳转到内容
搜索文档

在 Gateway 中修改 HTTP 请求标头

最后更新 查看 MarkdownAgent 设置

具有 Allow 操作的 Gateway HTTP 策略可以在匹配的请求到达目的地之前修改其标头。您可以添加动态值来设置标头,以便将诸如用户身份、源 IP 和其他输入之类的信息转发到上游服务,实施 SaaS 租户控制,剥离内部标头,以及覆盖标头内容。

标头操作需要进行 TLS 解密,因为 HTTP 标头仅在 Gateway 能够解密的流量上可见。

标头操作

Gateway 在 HTTP 策略上支持三种标头操作。当请求与配置了标头操作的 Allow 策略匹配时,Gateway 按以下顺序应用它们:

  1. Delete(删除) —— 从请求中移除标头。
  2. Overwrite(覆盖) —— 覆盖请求中的标头。具有匹配名称的标头的其值将被覆盖。如果标头不存在,则会被创建。
  3. Add(添加) —— 将标头附加到请求中。如果标头已存在,则添加的值将追加到现有值之后。

每个策略最多可以配置 20 个标头操作。标头名称限制为 256 字节,标头值限制为 4 KB。

添加标头

添加标头会将一个值附加到请求中。如果标头已存在,该值将与现有值并存,而不是替换它。

覆盖标头

覆盖标头会覆盖任何现有值。如果请求中尚不存在该标头,则创建它。当您需要保证特定的标头值而不论客户端发送了什么时,请使用此操作。

删除标头

删除标头会将它从请求中完全移除。如果标头不存在,该操作将没有任何效果。

动态标头值

标头值可以包括动态变量,Gateway 会在请求时使用当前会话中的身份、设备和网络上下文来解析这些变量。动态变量使用 @{...} 语法,并且可以在同一个值中与静态文本混合使用。

例如,在请求时,user-@{identity.email} 的标头值将解析为 user-jdoe@example.com

以下动态变量可用:

变量 描述
@{identity.email} 来自身份提供商的用户电子邮件地址。
@{identity.name} 来自身份提供商的用户显示名称。
@{identity.id} 用户的 Cloudflare 身份 UUID。
@{identity.groups} 用户的身份提供商组关联信息。
@{identity.SAML} 如果有配置,来自身份提供商的用户的 SAML 属性。
@{identity.OIDC} 如果有配置,来自身份提供商的用户的 OIDC 声明。
@{source.ip} 在 Gateway 中看到的用户的连接源 IP 地址。
@{destination.ip} 请求的目的 IP 地址。
@{device.id} Cloudflare One Client 设备 UUID。
@{device.posture} 设备姿态检查结果(序列化为 JSON 字符串)。

动态变量需要一个处于活动状态的身份会话。如果 Gateway 无法解析变量(例如,用户未通过身份验证),则该变量将被替换为类似 cf-unresolvedcf-invalid 的警告字符串,并向 HTTP 日志中添加一条警告。

配置标头操作

仪表板

要创建具有标头操作的 HTTP 策略:

  1. Cloudflare One 仪表板中,转到 Traffic policies(流量策略) > Firewall policies(防火墙策略) > HTTP
  2. 选择 Add a policy(添加策略)
  3. 构建一个表达式来匹配您想要修改的流量。
  4. Action(操作) 中,选择 Allow(允许)
  5. Modify request headers(修改请求标头) 下,选择 Add(添加)Overwrite(覆盖) 以添加或覆盖标头,或选择 Remove(移除) 以删除标头。
  6. 对于 Add 和 Overwrite 操作,输入标头名称和值。要使用动态变量,请在值字段中输入 @{...} 语法,或者选择 {} 按钮来查看可用值列表。对于 Remove 操作,仅输入标头名称。
  7. 保存您的策略。

API

要通过 API 创建具有标头操作的 HTTP 策略,请在 rule_settings 对象中包含 add_headersset_headersdelete_headers

curl https://api.cloudflare.com/client/v4/accounts/{account_id}/gateway/rules \
--header "Authorization: Bearer {api_token}" \
--header "Content-Type: application/json" \
--data '{
  "name": "Forward identity headers",
  "action": "allow",
  "enabled": true,
  "filters": ["http"],
  "traffic": "any(http.request.domains[*] in {\"app.example.com\"})",
  "rule_settings": {
    "add_headers": {
      "X-User-Email": ["@{identity.email}"],
      "X-User-Groups": ["@{identity.groups}"]
    },
    "set_headers": {
      "X-Forwarded-User": ["@{identity.email}"]
    },
    "delete_headers": ["X-Debug-Token", "X-Internal-Only"]
  }
}'

rule_settings 中用于标头操作的字段为:

字段 类型 描述
add_headers map<string, array<string>> 要追加的标头。每个键是一个标头名称,每个值是要添加的值列表。
set_headers map<string, array<string>> 要覆盖的标头。每个键是一个标头名称,每个值是要设置的值列表。
delete_headers array<string> 从请求中移除的标头名称。

单个标头值可以包含静态文本和动态变量的混合。例如:

{
  "add_headers": {
    "X-Request-Context": ["user=@{identity.email}, device=@{device.id}, src=@{source.ip}"]
  }
}

验证自定义标头

如果您从浏览器保存 HAR (HTTP Archive) 文件来分析您的 Web 流量,使用 Gateway 定义的自定义标头不会显示在该文件中。这是因为 Gateway 是在请求离开浏览器之后注入该标头的。

要验证 Gateway 正在应用自定义标头:

  1. 在包含自定义标头的策略中,添加一个选择器以匹配 HTTPBin(一个用于测试 HTTP 请求的开源网站)的流量。例如:

    选择器 运算符 逻辑 操作 不受信任的证书操作
    Application(应用程序) in Google Workspace Or(或) Allow(允许) Block(阻止)
    Domain(域名) in httpbin.org
  2. 在您的设备上,前往 httpbin.org/anything。您的自定义标头将显示在标头列表中。

  3. (可选)从您的策略中移除 HTTPBin 表达式。

使用用例

SaaS 租户控制

租户控制(Tenant control)允许您的用户访问企业 SaaS 应用程序,同时阻止访问同一服务上的个人账户。例如,您可以允许访问您公司的 Google Workspace,同时阻止个人 Gmail 登录。

Gateway 通过向匹配的请求中注入自定义 HTTP 标头来实现租户控制。这些标头告诉 SaaS 应用程序哪个租户(组织)是已授权的。如果用户尝试使用个人账户进行身份验证,SaaS 应用程序会读取该标头并拒绝该请求。

Microsoft 365

Microsoft 365 租户控制需要两条策略。在为策略排序时,确保它们遵循优先级顺序

优先级 选择器 运算符 操作 不受信任的证书操作
1 Domain(域名) is login.live.com Allow(允许) Block(阻止)
自定义标头名称 自定义标头值
Sec-Restrict-Tenant-Access-Policy restrict-msa
优先级 选择器 运算符 操作 不受信任的证书操作
2 Application(应用程序) in Microsoft Office365 Allow(允许) Block(阻止)
自定义标头名称 自定义标头值
Restrict-Access-To-Tenants, Restrict-Access-Context 您组织的域名

有关更多信息,请参阅 Microsoft Entra ID 文档

Google Workspace

选择器 运算符 操作 不受信任的证书操作
Application(应用程序) in Google Workspace Allow(允许) Block(阻止)
自定义标头名称 自定义标头值
X-GoogApps-Allowed-Domains 您组织的域名

有关更多信息,请参阅 Google Workspace 文档

Slack

选择器 运算符 操作 不受信任的证书操作
Application(应用程序) in Slack Allow(允许) Block(阻止)
自定义标头名称 自定义标头值
X-Slack-Allowed-Workspaces-Requester, X-Slack-Allowed-Workspaces 您组织的工作区

有关更多信息,请参阅 Slack 文档

Dropbox

选择器 运算符 操作 不受信任的证书操作
Application(应用程序) in Dropbox Allow(允许) Block(阻止)
自定义标头名称 自定义标头值
X-Dropbox-allowed-Team-Ids 您组织的 ID

有关更多信息,请参阅 Dropbox 文档

ChatGPT

选择器 运算符 操作 不受信任的证书操作
Application(应用程序) in ChatGPT Allow(允许) Block(阻止)
自定义标头名称 自定义标头值
Chatgpt-Allowed-Workspace-Id 您组织的工作区 ID

有关更多信息,请参阅 OpenAI 文档

将用户身份转发到上游服务

您可以使用动态标头值将用户身份信息转发到您的上游应用程序,而不需要这些应用程序直接与 Cloudflare Access 集成。

标头名称 标头值
X-User-Email @{identity.email}
X-User-Name @{identity.name}
X-User-Groups @{identity.groups}
X-Source-IP @{source.ip}

您的上游应用程序可以读取这些标头来识别用户、执行授权逻辑或填充审计日志。

剥离内部标头

为了防止客户端伪造内部标头,在转发请求之前,使用删除操作移除标头,然后使用添加或设置操作以验证后的值重新注入它们。

curl https://api.cloudflare.com/client/v4/accounts/{account_id}/gateway/rules \
--header "Authorization: Bearer {api_token}" \
--header "Content-Type: application/json" \
--data '{
  "name": "Replace internal headers",
  "action": "allow",
  "enabled": true,
  "filters": ["http"],
  "traffic": "any(http.request.domains[*] in {\"internal.example.com\"})",
  "rule_settings": {
    "delete_headers": ["X-Internal-User"],
    "set_headers": {
      "X-Internal-User": ["@{identity.email}"]
    }
  }
}'

在 Cloudflare WAF 中排除用户

您可以在 HTTP 策略中包含自定义标头,以允许您的用户通过 Cloudflare WAF。这对于仅允许 Cloudflare One Client 用户通过您的 WAF 很有用。

  1. 为您的 WAF 后面的内部域名创建一条带有自定义标头的 Allow 策略。

    选择器 运算符 操作
    Domain(域名) in internalapp.com Allow(允许)
    自定义标头名称 自定义标头值
    X-Example-Header example-value
  2. 在 Cloudflare WAF 中,创建一个自定义规则要求相同的 HTTP 标头

在浏览器隔离中使用自定义标头

您配置浏览器隔离来发送自定义标头。这对于为隔离的 SaaS 应用程序实施租户控制,或者向隔离的网站发送任意自定义请求标头有用。

要在浏览器隔离中使用自定义标头,请创建两条针对相同域名或应用程序组的 HTTP 策略。例如,您可以为 HTTPBin(一个用于测试 HTTP 请求的开源网站)创建策略:

  1. httpbin.org 创建一条 Isolate 策略。

    选择器 运算符 操作
    Domain(域名) in httpbin.org Isolate(隔离)
  2. httpbin.org 创建一条带有自定义标头的 Allow 策略。

    选择器 运算符 操作
    Domain(域名) in httpbin.org Allow(允许)
    自定义标头名称 自定义标头值
    Example-Header example-value
  3. 前往 httpbin.org/anything。Cloudflare 将在隔离浏览器中渲染该网站。您的自定义标头将显示在标头列表中。

这篇文档对您有帮助吗?