如何根据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


0
2
Jeson
回复
qq_金融超越战_03665934
OK 谢谢你
2018-07-31
共2条回复

Nginx入门到实践-Nginx中间件应用+搭建Webserver架构

中间件、负载均衡、应用层安全防护、动静分离、Nginx+LUA开发等

4183 学习 · 908 问题

查看课程