ZBLOG

ngx.header.referrer_policy = nil ngx.header.referrer_policy = "unsafe-url" openresty这份代码为什么删除不掉上游的响应头

在 OpenResty 中通过 ngx.header.referrer_policy 无法删除上游响应头的原因及解决方案如下:


问题原因

  1. 执行顺序问题
    OpenResty 处理响应头的阶段可能晚于上游服务器(如 Nginx 的 proxy_pass)返回的响应头。如果上游已经设置了 Referrer-Policy,直接修改 ngx.header 可能无法覆盖或删除它。

  2. Header 重复性
    某些 HTTP 头部(如 Referrer-Policy)允许多个值共存。若上游已设置该头部,仅通过 Lua 修改可能不会覆盖原有值,而是追加新值。

  3. Nginx 代理模块行为
    使用 proxy_pass 时,默认会保留上游的响应头(除非显式清除)。需要通过 Nginx 配置指令主动干预。


解决方案

方法1:在 Nginx 配置中清除上游头部

在代理配置中使用 proxy_hide_headerproxy_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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23865

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?