如何根据url的参数访问不同的proxy_pass
来源:4-34 Nginx与Lua的开发_实战场景灰度发布场景演示4
qq_金融超越战_03665934
2018-07-04
老师,请教你一个问,我在开发中遇到这样的场景,nginx中的
server {
listen 80;
server_name localhost;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_max_temp_file_size 0;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_pass http://10.68.132.252:/device/?sn=$arg_sn;
}
}
现在的需要是这样的。如果$arg_sn的长度大于6,我需要访问http://10.68.132.252:/tv/?sn=$arg_sn这个url.
比如我访问localhost:80/?sn=123456,那么我就会代理 http://10.68.132.252:/device/?sn=123456;如何我访问
localhost:80/?sn=1234567,这个时候sn的长度大于6,就应该访问http://10.68.132.252:/tv/?sn=1234567这个路径,我怎么做到呢?
1回答
-
Jeson
2018-07-04
你好,你这个场景实现通过Nginx的配置语法是实现不了的,需要结合lua来匹配实现转发。
首你需要匹配到这个localhost:80/?sn=1234567这个sn=..的参数,可以通过nginx定义变量(假设为sn_var)来作,实现正则表达式匹配。
大概如下,你参考下
nginx.conf配置
location @testurl{ proxy_pass http://指定url; } location @testurl2{ proxy_pass http://指定url2; }
#getStringLength 这个函数用于获取传入字符的长度 function getStringLength(str) if str == nil then return 0; else return string.len(str); endend #setTarget用于判断逻辑实现,供参考 function setTarget() if (ngx.req.get_method() == "GET") then if (getStringLength(这里匹配到变量ngx.var.sn_var) > 6) then ngx.exec("@testurl") ...其他逻辑 end endend
022018-07-31
相似问题