Heim > Fragen und Antworten > Hauptteil
Im Abschnitt http {} legen Sie
festmap $http_header_1 $route {default 10;}
map $http_header_2 $route {default 20;}
map $http_header_3 $route {default 30;}
Der angeforderte Header ist auf
gesetztcurl -H "header_1:0" http://xxx.com/xxx
Dann im Abschnitt Server {},
echo "$route";
Das gedruckte Ergebnis ist immer 30, da die dritte Kartenanweisung den vorherigen Wert überschreibt;
Die Frage ist: Wie erhält man den gewünschten Wert basierend auf verschiedenen Headern im Kartenteil?
Um Problem 1 zu lösen, ist meiner Meinung nach
map $http_header_1 $route1 {default 10;}
map $http_header_2 $route2 {default 20;}
map $http_header_3 $route3 {default 30;}
Dann verwenden Sie im Teil „location {}“
if ($http_header_1) {
echo "$route1";
}
Um den gewünschten Wert zu erhalten; Beschämenderweise scheint dieses if nicht erfolgreich zu sein und Nginx empfiehlt die Verwendung von if
阿神2017-05-16 17:31:03
好吧, 用if搞定了, 可是nginx不推荐使用if, 哪位同学有更好的方案?
感谢. 不过您的答案, 没有回答我的问题.
我的业务需求是:
map $http_header_1 $route {
default 110;
a 111;
b 112;
c 113;
}
map $http_header_2 $route {
default 210;
a 211;
b 212;
c 213;
}
map $http_header_3 $route {
default 310;
a 311;
b 312;
c 313;
}
也即, 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个业务进程, 各自监听一个端口.
漂亮男人2017-05-16 17:31:03
楼主需要明白几处: 1. map指令内的语句是默认必然执行1 of N的。
map $http_header_1 $route {default 10;}
map $http_header_2 $route {default 20;}
map $http_header_3 $route {default 30;}
就相当于
传入$http_header_1任意值(即使为null),返回$route=10;
传入$http_header_2任意值(即使为null),返回$route=20;
传入$http_header_3任意值(即使为null),返回$route=30;
所以,最终传出的$route为30;
map是组建多个传入值与传出值映射关系的指令,这个传入值最好在传入到map前已经被定义、赋值了,不然就直接执行default。
楼主可以试试
map $http_user_agent $route{
"Baiduspider" 1; #当$http_user_agent为Baiduspider,返回$route = 1
"Googlebot" 2; #当$http_user_agent为Googlebot,返回$route = 2
default 0; #否则,返回$route = 0
}