nginx proxy_pass规则

4 篇文章 0 订阅
2 篇文章 0 订阅

nginx部分配置格式

server {

    listen 5000;
    server_name www.liushuyu.top;

    location  /ccc/test {
        proxy_pass http://119.91.100.32:6000/test;
    }
}

server {

    listen 6000;
    server_name 119.91.100.32;

    location /test/ {
        alias /test/ ;
    }
}

proxy_pass规则

1.proxy_pass不带url情况
  • 1.1 如果
    proxy_pass为http://119.91.100.32:6000 ,
    location为/ccc/test/,
    访问的url为http://www.liushuyu.top:5000/ccc/test/aaa/bbb.txt

    server {
    
        listen 5000;
        server_name www.liushuyu.top;
    
        location  /ccc/test/ {
            proxy_pass http://119.91.100.32:6000;
        }
    }
    

    代理后的url为http://www.liushuyu.top:6000/ccc/test/aaa/bbb.txt
    也就是说proxy_pass http://119.91.100.32:6000替换了http://www.liushuyu.top:5000

  • 1.2 如果
    proxy_pass为http://119.91.100.32:6000 ,
    location为/ccc/test,
    访问的url为http://www.liushuyu.top:5000/ccc/test/aaa/bbb.txt

    server {
    
        listen 5000;
        server_name www.liushuyu.top;
    
        location  /ccc/test {
            proxy_pass http://119.91.100.32:6000;
        }
    }
    

    代理后的url为http://www.liushuyu.top:6000/ccc/test/aaa/bbb.txt
    也就是说proxy_pass http://119.91.100.32:6000替换了http://www.liushuyu.top:5000

  • 1.3 可支持正则表达式
    proxy_pass为http://119.91.100.32:6000 ,
    location为~ /.*/test/,
    访问的url为http://www.liushuyu.top:5000/ccc/test/aaa/bbb.txt

    server {
    
        listen 5000;
        server_name www.liushuyu.top;
    
        location ~ /.*/test/ {
            proxy_pass http://119.91.100.32:6000;
        }
    }
    

    代理后的url为http://www.liushuyu.top:6000/ccc/test/aaa/bbb.txt
    也就是说proxy_pass http://119.91.100.32:6000替换了http://www.liushuyu.top:5000

2.proxy_pass带url情况
  • 2.1如果
    proxy_pass为http://119.91.100.32:6000/ ,
    location为/ccc/test/,
    访问的url为http://www.liushuyu.top:5000/ccc/test/aaa/bbb.txt

    server {
    
        listen 5000;
        server_name www.liushuyu.top;
    
        location  /ccc/test/ {
            proxy_pass http://119.91.100.32:6000/;
        }
    }
    

    代理后的url为http://www.liushuyu.top:6000/aaa/bbb.txt
    也就是说proxy_pass http://119.91.100.32:6000/替换了http://www.liushuyu.top:5000/ccc/test/

  • 2.2 如果
    proxy_pass为http://119.91.100.32:6000/test/,
    location为/ccc/test/,
    访问的url为http://www.liushuyu.top:5000/ccc/test/aaa/bbb.txt

    server {
    
        listen 5000;
        server_name www.liushuyu.top;
    
        location  /ccc/test/ {
            proxy_pass http://119.91.100.32:6000/test/;
        }
    }
    

    代理后的url为http://www.liushuyu.top:6000/test/aaa/bbb.txt
    也就是说proxy_pass http://119.91.100.32:6000/test/替换了http://www.liushuyu.top:5000/ccc/test/

  • 2.3 如果
    proxy_pass为http://119.91.100.32:6000/test/,
    location为/ccc/test,
    访问的url为http://www.liushuyu.top:5000/ccc/test/aaa/bbb.txt

    server {
    
        listen 5000;
        server_name www.liushuyu.top;
    
        location  /ccc/test {
            proxy_pass http://119.91.100.32:6000/test/;
        }
    }
    

    代理后的url为http://www.liushuyu.top:6000/test/aaa/bbb.txt
    也就是说proxy_pass http://119.91.100.32:6000/test替换了http://www.liushuyu.top:5000/ccc/test

  • 2.4 如果
    proxy_pass为http://119.91.100.32:6000/test,
    location为/ccc/test/,
    访问的url为http://www.liushuyu.top:5000/ccc/test/aaa/bbb.txt

    server {
    
        listen 5000;
        server_name www.liushuyu.top;
    
        location  /ccc/test/ {
            proxy_pass http://119.91.100.32:6000/test;
        }
    }
    

    代理后的url为http://www.liushuyu.top:6000/testaaa/bbb.txt
    也就是说proxy_pass http://119.91.100.32:6000/test替换了http://www.liushuyu.top:5000/ccc/test/

  • 2.5 如果
    proxy_pass为http://119.91.100.32:6000/test ,
    location为/ccc/test,
    访问的url为http://www.liushuyu.top:5000/ccc/test/aaa/bbb.txt

    server {
    
        listen 5000;
        server_name www.liushuyu.top;
    
        location  /ccc/test {
            proxy_pass http://119.91.100.32:6000/test;
        }
    }
    

    代理后的url为http://www.liushuyu.top:6000/test/aaa/bbb.txt
    也就是说proxy_pass http://119.91.100.32:6000/test替换了http://www.liushuyu.top:5000/ccc/test

  • 2.6 如果
    location后面是接的正则表达式,
    则proxy_pass不能有url,否则会报错

    2021/05/27 10:12:41 [emerg] 23077#0: invalid location modifier "*~" in /etc/nginx/conf.d/5000.conf:9
    2021/05/27 10:12:58 [emerg] 23116#0: "proxy_pass" cannot have URI part in location given by regular expression, or 		inside named location, or inside "if" statement, or inside "limit_except" block in /etc/nginx/conf.d/5000.conf:10
    

总结

1.proxy_pass不携带url,如果proxy_pass只有【协议】://【ip或者域名】:【端口】,没有url("/“也是url),那么只会proxy_pass只会替换源请求的【协议】://【ip或者域名】:【端口】
2.proxy_pass携带了url(”/“也是url),且url以”/“结尾,则proxy_pass中的url都会替换掉location的url,并且无论location有没有”/"结尾,代理后的url都能正常访问

比如proxy_pass为http://119.91.100.32:6000/test/,
location为/ccc/test,
访问的url为http://www.liushuyu.top:5000/ccc/test/aaa/bbb.txt,最后不会变成http://www.liushuyu.top:5000/test//aaa/bbb.txt,而是http://www.liushuyu.top:5000/test/aaa/bbb.txt

3.proxy_pass携带了url(“/“也是url),但url不是以”/“结尾,,则location如果结尾携带”/”,proxy_pass中的url都会替换掉location的url,代理后的url会少一根"/"

比如proxy_pass为http://119.91.100.32:6000/test,
location为/ccc/test/,
访问的url为http://www.liushuyu.top:5000/ccc/test/aaa/bbb.txt,最后变成http://www.liushuyu.top:5000/testaaa/bbb.txt

4…proxy_pass携带了url(“/“也是url),但url不是以”/“结尾,,则location如果结尾携带”/”,proxy_pass中的url都会替换掉location的url,代理后的url正常

比如proxy_pass为http://119.91.100.32:6000/test,
location为/ccc/test,
访问的url为http://www.liushuyu.top:5000/ccc/test/aaa/bbb.txt,最后变成http://www.liushuyu.top:5000/test/aaa/bbb.txt

5.如果location后面是接的正则表达式,则proxy_pass不能有url,否则会报错

以下附带一个简单的伪代码

if proxy_pass不携带url:
    proxy_pass中的内容替换原请求的【协议】://【ip或者域名】:【端口】,替换后的url正常
else proxy_pass携带url:
    if proxy_pass携带的url以"/"结尾:
        proxy_pass中的内容替换原请求的【协议】://【ip或者域名】:【端口】加上location的url,替换后的url正常
    else proxy_pass携带的url不以"/"结尾:
        if location的url以"/"结尾:
            proxy_pass中的内容替换原请求的【协议】: // 【ip或者域名】:【端口】加上location的url, 替换后的url会少一根"/"
        else:
            proxy_pass中的内容替换原请求的【协议】://【ip或者域名】:【端口】加上location的url,替换后的url正常
    else location的url是正则表达式:
            nginx启动会报错

新领悟:

1.proxy_pass如果以域名+端口开头,以端口结尾,则只会替换源url中的域名+端口(可以理解为代理的是一台服务器)
2.proxy_pass如果以域名+端口开头,以"/“结尾,则会替换源url中的location+/(location中如果包含了”/“则不另外+/)(可以理解为代理的是一个目录)
3.proxy_pass如果以域名+端口开头,以”"结尾,则会替换源url中的location (可以理解为代理的是一个文件)

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值