在 http {} 部分, 设置了
map $http_header_1 $route {default 10;}
map $http_header_2 $route {default 20;}
map $http_header_3 $route {default 30;}
请求的header设置为
curl -H "header_1:0" http://xxx.com/xxx
然后在 server {} 部分,
echo "$route";
打印结果始终为 30, 因为 第三个map指令覆盖了前面的值;
问题来了: 如何在map部分根据不同的header, 获得想要的值?
为解决问题1, 我想的办法为
map $http_header_1 $route1 {default 10;}
map $http_header_2 $route2 {default 20;}
map $http_header_3 $route3 {default 30;}
然后在 location {} 部分, 用
if ($http_header_1) {
echo "$route1";
}
去获得想要的值; 可耻的是, 这个 if 似乎没成功, 而且nginx不推荐使用if
好吧, 用if搞定了, 可是nginx不推荐使用if, 哪位同学有更好的方案?
@冰纷 那位, 似乎回复您的文本不能使用md格式, 我在这里回复您一下:
感谢. 不过您的答案, 没有回答我的问题.
我的业务需求是:
也即, request带有且只带有 $httpheader1,$httpheader2,$httpheader3 的其中一个, 并有相应的值为 a,b,c 的其中一个.
nginx需要根据判断该头的key, 并根据key对应的value返回一个确认的 $route 值.
业务例子:
最终$route为 111, 并 fastcgi_pass localhost:111
最终$route为 212, 并 fastcgi_pass localhost:212
最终$route为 313, 并 fastcgi_pass localhost:313
然后
最终一共有9个业务进程, 各自监听一个端口.
不要问我为什么会有这种奇葩需求, 深藏功与名啊~~~
所以, 您的答案, 不能满足我的兽欲啊
楼主需要明白几处: 1. map指令内的语句是默认必然执行1 of N的。
就相当于
所以,最终传出的$route为30;
map是组建多个传入值与传出值映射关系的指令,这个传入值最好在传入到map前已经被定义、赋值了,不然就直接执行default。
楼主可以试试