在 OpenResty 中,你可以使用 Lua 脚本在转发请求到上游(upstream)时自定义增加 HTTP 头部。以下是几种常见的方法:
方法1:通过 ngx.req.set_header
设置头部
在 access_by_lua_*
或 rewrite_by_lua_*
阶段动态添加头部:
location /proxy {
proxy_pass http://your_upstream_server;
access_by_lua_block {
-- 添加自定义头部
ngx.req.set_header("X-Custom-Header", "your_value")
ngx.req.set_header("X-Another-Header", "another_value")
}
}
方法2:通过 proxy_set_header
指令
Nginx 原生支持 proxy_set_header
,但结合 Lua 可以动态生成值:
location /proxy {
proxy_pass http://your_upstream_server;
proxy_set_header X-Static-Header "static_value";
# 通过 Lua 变量动态设置
set_by_lua $dynamic_header '
return "dynamic_value_" .. os.time()
';
proxy_set_header X-Dynamic-Header $dynamic_header;
}
方法3:在 header_filter_by_lua
中修改响应头
如果需要在上游返回的响应中添加头部(而非请求头),可以这样操作:
location /proxy {
proxy_pass http://your_upstream_server;
header_filter_by_lua_block {
ngx.header["X-Response-Header"] = "added_by_openresty"
}
}
注意事项
- 阶段选择:
access_by_lua_*
:适合修改转发前的请求头。header_filter_by_lua_*
:适合修改上游返回的响应头。
- 覆盖原有头部:
ngx.req.set_header
会覆盖同名的现有头部,若需追加值需手动拼接。
- 性能影响:
- Lua 操作会增加少量开销,建议在关键逻辑中使用。
完整示例
http {
server {
listen 80;
location /forward {
proxy_pass http://backend;
# Lua脚本动态添加请求头
access_by_lua_block {
ngx.req.set_header("X-Request-ID", ngx.var.request_id)
ngx.req.set_header("X-Auth-Token", "Bearer " .. os.time())
}
# 静态添加额外头部
proxy_set_header Host $host;
}
}
upstream backend {
server your_backend_ip:port;
}
}
通过上述方法,你可以灵活控制转发的 HTTP 头部。如果需要更复杂的逻辑(如从 Redis/DB 获取数据),只需在 Lua 中扩展即可。
内容由零声教学AI助手提供,问题来源于学员提问