Nginx使用auth_request调用Django时无法获取响应自定义头部如何解决
问题原因&解决方案
核心问题原因
- auth_request 发起的子请求的响应数据默认不会共享到父请求的上下文,你在
/novnc/块中直接使用$upstream_http_*读取的是当前父请求的上游响应,根本拿不到auth子请求的返回头。 - 你之前注释的
set指令写在了/novnc-auth子请求的配置块中,变量仅在子请求上下文生效,父请求无法访问。 proxy_set_header用了单引号包裹参数,Nginx 单引号内的变量不会被解析,就算变量有值也会被当作普通字符串输出。
修正后的配置
不需要修改/novnc-auth块的原有配置,直接调整/novnc/块的内容即可:
location = /novnc/ { auth_request /novnc-auth; # 从auth子请求的响应头中提取值,赋值给父请求可访问的变量 auth_request_set $pve_cookie $upstream_http_pve; auth_request_set $vm_host $upstream_http_vmhhost; # 用双引号包裹才能正常解析变量 proxy_set_header Cookie "PVEAuthCookie=$pve_cookie"; proxy_pass https://$vm_host$is_args$args; }
额外排查步骤
如果修改后还是报错,可以先做以下验证:
- 直接请求Django接口确认响应头正常返回:
curl -I http://127.0.0.1:8000/api/proxmox/novnc-connection-lookup/替换为实际的novncCookie值/
检查返回的响应头中是否存在Pve和Vmhhost字段。 - 可以在Nginx access日志配置中新增
$upstream_http_pve $upstream_http_vmhhost变量打印,确认子请求确实拿到了返回值。
内容的提问来源于stack exchange,提问作者James Lin
相关产品推荐
相关产品推荐

