Nginx -- 07 -- location、proxy_pass配置解析

原文链接:Nginx – 07 – location、proxy_pass配置解析


相关文章:


当我们在 Nginx 中配置代理转发 location、proxy_pass 时,经常会碰到 url 有加 /不加 / 的情况,让人十分的困惑,这里我们就来分析下加 / 和不加 / 究竟有什么区别


一、部署项目

  • 首先我用 IDEA 简单地搭建了一个 SpringBoot 项目,使用了 freemark 作为模板引擎

    • pom.xml

      <dependencies>
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-web</artifactId>
          </dependency>
      
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-test</artifactId>
              <scope>test</scope>
          </dependency>
      
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-freemarker</artifactId>
          </dependency>
      </dependencies>
      
    • application.yml

      server:
        port: 9000
      
    • NginxController.java

      /**
       * @Title: NginxController.java
       * @Description: Nginx Controller层
       * @Author: xj
       * @Date: 2019/1/25 17:22
       */
      @Controller
      public class NginxController {
      
          private static final Logger logger = LoggerFactory.getLogger(NginxController.class);
      
          @GetMapping(value = "/test")
          public String test1() {
              logger.info("I'm test1,my access path is 【{}】", "/test");
              return "nginx";
          }
      
          @GetMapping(value = "/proxy/test")
          public String test2() {
              logger.info("I'm test2,my access path is 【{}】", "/proxy/test");
              return "nginx";
          }
      
          @GetMapping(value = "/nginx/test")
          public String test3() {
              logger.info("I'm test3,my access path is 【{}】", "/nginx/test");
              return "nginx";
          }
      
          @GetMapping(value = "/proxytest")
          public String test4() {
              logger.info("I'm test4,my access path is 【{}】", "/proxytest");
              return "nginx";
          }
      
          @GetMapping(value = "/nginxtest")
          public String test5() {
              logger.info("I'm test5,my access path is 【{}】", "/nginxtest");
              return "nginx";
          }
      }
      
    • nginx.ftl

      <html>
          <body>
              <h1>我是一个页面!!!</h1>
          </body>
      </html>
      
  • 搭建完项目后,我们将其打包部署到服务器上,然后运行程序,其端口为 9000


二、测试

  • 1、location 后加 /,proxy_pass 后加 /

    • 端口后加 / (匹配 test1() 方法)

      server {
          listen  7040;
          server_name  127.0.0.1;
      
          location /nginx/ {
              proxy_pass  http://127.0.0.1:9000/;
          }
      }
      
      • 测试路径:http://192.168.20.210:7040/nginx/test

      • 代理后路径:http://192.168.20.210:9000/test

      • 这种情况下,Nginx 会把 location 中匹配到的部分给代理掉,可以理解为使用 http://192.168.20.210:9000/ 替换掉了 http://192.168.20.210:7040/nginx/

    • 路由后加 / (匹配 test2() 方法)

      server {
          listen  7040;
          server_name  127.0.0.1;
      
          location /nginx/ {
              proxy_pass  http://127.0.0.1:9000/proxy/;
          }
      }
      
      • 测试路径:http://192.168.20.210:7040/nginx/test

      • 代理后路径:http://192.168.20.210:9000/proxy/test

      • 这种情况下,Nginx 会把 location 中匹配到的部也给代理掉,可以理解为使用 http://127.0.0.1:9000/proxy/ 替换掉了 http://192.168.20.210:7040/nginx/

  • 2、location 后加 /,proxy_pass 后不加 /

    • 端口后不加 / (匹配 test3() 方法)

      server {
          listen  7040;
          server_name  127.0.0.1;
      
          location /nginx/ {
              proxy_pass  http://127.0.0.1:9000;
          }
      }
      
      • 测试路径:http://192.168.20.210:7040/nginx/test

      • 代理后路径:http://192.168.20.210:9000/nginx/test

      • 这种情况下,Nginx 不会把 location 中匹配到的部分给代理掉,可以理解为使用 http://127.0.0.1:9000 替换掉了 http://192.168.20.210:7040

    • 路由后不加 / (匹配 test4() 方法)

      server {
          listen  7040;
          server_name  127.0.0.1;
      
          location /nginx/ {
              proxy_pass  http://127.0.0.1:9000/proxy;
          }
      }
      
      • 测试路径:http://192.168.20.210:7040/nginx/test

      • 代理后路径:http://192.168.20.210:9000/proxytest

      • 这种情况下,Nginx 会把 location 中匹配到的部分给代理掉,可以理解为使用 http://127.0.0.1:9000/proxy 替换掉了 http://192.168.20.210:7040/nginx/

  • 3、location 后不加 /,proxy_pass 后加 /

    • 端口后加 /

      server {
          listen  7040;
          server_name  127.0.0.1;
      
          location /nginx {
              proxy_pass  http://127.0.0.1:9000/;
          }
      }
      
      • 第一种 (匹配 test1() 方法)

        • 测试路径:http://192.168.20.210:7040/nginx/test

        • 代理后路径:http://192.168.20.210:9000/test

      • 第二种 (匹配 test1() 方法)

        • 测试路径:http://192.168.20.210:7040/nginxtest

        • 代理后路径:http://192.168.20.210:9000/test

      • 这两种情况下,Nginx 会把 location 中匹配到的部分给代理掉,第一种可以理解为使用 http://192.168.20.210:9000/ 替换掉了 http://192.168.20.210:7040/nginx/;第二种可以理解为使用 http://192.168.20.210:9000/ 替换掉了 http://192.168.20.210:7040/nginx

      • 由上可知,与 location 后加 / 相比,不同之处在于加 / 为全匹配 (只能匹配 /nginx/),而不加 / 为模糊匹配 (既可以匹配 /nginx/,也可以匹配 /nginx*)

    • 路由后加 /

      server {
          listen  7040;
          server_name  127.0.0.1;
      
          location /nginx {
              proxy_pass  http://127.0.0.1:9000/proxy/;
          }
      }
      
      • 第一种 (匹配 test2() 方法)

        • 测试路径:http://192.168.20.210:7040/nginx/test

        • 代理后路径:http://192.168.20.210:9000/proxy/test

      • 第二种 (匹配 test2() 方法)

        • 测试路径:http://192.168.20.210:7040/nginxtest

        • 代理后路径:http://192.168.20.210:9000/proxy/test

      • 这两种情况下,Nginx 会把 location 中匹配到的部分给代理掉,第一种可以理解为使用 http://192.168.20.210:9000/proxy/ 替换掉了 http://192.168.20.210:7040/nginx/;第二种可以理解为使用 http://192.168.20.210:9000/proxy/ 替换掉了 http://192.168.20.210:7040/nginx

      • 由上可知,与 location 后加 / 相比,不同之处在于加 / 为全匹配 (只能匹配 /nginx/),而不加 / 为模糊匹配 (既可以匹配 /nginx/,也可以匹配 /nginx*)

  • 4、location 后不加 /,proxy_pass 后不加 /

    • 端口后不加 /

      server {
          listen  7040;
          server_name  127.0.0.1;
      
          location /nginx {
              proxy_pass  http://127.0.0.1:9000;
          }
      }
      
      • 第一种 (匹配 test3() 方法)

        • 测试路径:http://192.168.20.210:7040/nginx/test

        • 代理后路径:http://192.168.20.210:9000/nginx/test

      • 第二种 (匹配 test5() 方法)

        • 测试路径:http://192.168.20.210:7040/nginxtest

        • 代理后路径:http://192.168.20.210:9000/nginxtest

      • 这两种情况下,Nginx 不会把 location 中匹配到的部分给代理掉,两种都可以理解为使用 http://127.0.0.1:9000 替换掉了 http://192.168.20.210:7040

      • 由上可知,与 location 后加 / 相比,不同之处在于加 / 为全匹配 (只能匹配 /nginx/),而不加 / 为模糊匹配 (既可以匹配 /nginx/,也可以匹配 /nginx*)

    • 路由后不加 /

      server {
          listen  7040;
          server_name  127.0.0.1;
      
          location /nginx {
              proxy_pass  http://127.0.0.1:9000/proxy;
          }
      }
      
      • 第一种 (匹配 test2() 方法)

        • 测试路径:http://192.168.20.210:7040/nginx/test

        • 代理后路径:http://192.168.20.210:9000/proxy/test

      • 第二种 (匹配 test4() 方法)

        • 测试路径:http://192.168.20.210:7040/nginxtest

        • 代理后路径:http://192.168.20.210:9000/proxytest

      • 这两种情况下,Nginx 会把 location 中匹配到的部分给代理掉,两种都可以理解为使用 http://127.0.0.1:9000/proxy 替换掉了 http://192.168.20.210:7040/nginx

      • 由上可知,与 location 后加 / 相比,不同之处在于加 / 为全匹配 (只能匹配 /nginx/),而不加 / 为模糊匹配 (既可以匹配 /nginx/,也可以匹配 /nginx*)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值