在 OpenResty 中通过 ngx.header.referrer_policy
无法删除上游响应头的原因及解决方案如下:
问题原因
执行顺序问题
OpenResty 处理响应头的阶段可能晚于上游服务器(如 Nginx 的proxy_pass
)返回的响应头。如果上游已经设置了Referrer-Policy
,直接修改ngx.header
可能无法覆盖或删除它。Header 重复性
某些 HTTP 头部(如Referrer-Policy
)允许多个值共存。若上游已设置该头部,仅通过 Lua 修改可能不会覆盖原有值,而是追加新值。Nginx 代理模块行为
使用proxy_pass
时,默认会保留上游的响应头(除非显式清除)。需要通过 Nginx 配置指令主动干预。
解决方案
方法1:在 Nginx 配置中清除上游头部
在代理配置中使用 proxy_hide_header
或 proxy_set_header
:
location / {
proxy_pass http://upstream_server;
proxy_hide_header Referrer-Policy; # 隐藏上游的 Referrer-Policy
proxy_set_header Referrer-Policy ""; # 显式设置为空(可选)
}
方法2:在 OpenResty Lua 中强制覆盖
确保在正确的阶段(如 header_filter_by_lua*
)操作,并清除现有头部:
header_filter_by_lua_block {
ngx.header["Referrer-Policy"] = nil -- 先删除原有头部
ngx.header.Referrer_Policy = "unsafe-url" -- 再设置新值(注意下划线)
}
注意:OpenResty 中头部名称需用下划线(如
Referrer_Policy
),而非连字符。
方法3:使用 add_header 覆盖
在 Nginx location 中强制覆盖:
location / {
add_header Referrer-Policy "unsafe-url" always; # always 参数确保覆盖所有情况
}
关键点总结
- 优先级:Nginx 配置指令(如
proxy_hide_header
)通常比 Lua 代码更早生效。 - 阶段选择:若需动态处理,应在
header_filter_by_lua*
阶段修改头部。 - 命名规范:Lua 中需将连字符 (
-
)替换为下划线 (_
) ,例如ngx.header.referrer_policy
。
通过上述方法可以确保彻底删除或覆盖上游的 Referrer-Policy
。
内容由零声教学AI助手提供,问题来源于学员提问