Nginx如何根据Authorization请求头实现条件流量镜像功能
解决Nginx条件流量镜像的配置方案
核心思路
Nginx的mirror指令支持传入动态变量作为镜像目标,当变量值为空时,镜像操作会自动跳过,无需在if块中声明。我们可以通过map指令根据Authorization请求头的存在情况动态生成镜像目标路径,规避if块不支持mirror指令的限制。
调整后的完整配置
# 必须放在http块层级,和upstream同级 map $http_authorization $mirror_target { # 默认值为空,不触发镜像 default ""; # 正则匹配任意非空的Authorization请求头,赋值为镜像路径 "~." "/mirror"; } upstream backend { server backend.local:10000; } upstream test_backend { server test.local:20000; } server { server_name proxy.local; listen 8000; location / { # 直接使用变量控制镜像,无需if mirror $mirror_target; proxy_pass http://backend; } location = /mirror { internal; proxy_pass http://test_backend$request_uri; } }
说明
- 原配置报错的原因是
mirror指令不属于rewrite模块支持的指令,无法在if块的上下文中使用 map块必须定义在http配置层级,不能放在server或location块内- 正则
~.表示匹配任意长度大于0的字符串,只要请求携带非空的Authorization头,就会触发镜像逻辑
内容的提问来源于stack exchange,提问作者Alireza Beitari
相关产品推荐
相关产品推荐

