nginx下使用同一path区分前后端

248 阅读1分钟

背景

历史项目,前端包是在后端的包里,发版总需要找后端发版,考虑将前后端拆开。

常规

常规项目,如果前后端在一台服务器上,并且需要nginx进行配置代理时,一般会在路径上做区分,比如:
前端: xxx.xxx.xx/bbq/index
后端接口路径:xxx.xxx.xx/bbq-end/

非常规

有常规,就有非常规。我当前的项目就遇到了前后端需要共用一个path来进行区分。
前端:xxx.xxx.xx/bbq/index
后端接口路径:xxx.xxx.xx/bbq/ 需要在nginx下使用同一个关键path:bbq 来进行区分及转发。

先说最终配置

前端相关nginx配置

     location = /bbq/ {
         alias   /home/appadmin/nginx/html/bbq/;
         try_files $uri $uri/index.html =404;
     }
     location ^~ /bbq/static/ {
         alias   /home/appadmin/nginx/html/bbq/static/;
     }
     location ^~ /bbq/assets/ {
         alias   /home/appadmin/nginx/html/bbq/assets/;
     }

后端相关nginx配置

    location ~ ^/tkp-wechat-health/(.+)$ {
        proxy_pass  http://xx.xx.xx.xx:6003;
    }

配置解析及相关问题

nginx配置解析

location = /bbq/ 用来匹配html文件的;
location ^~ /bbq/static/ 用来匹配前端static文件夹下内容 location ^~ /bbq/assets/ 用来匹配前端assets文件夹下内容

nginx配置关键点

利用location匹配的优先级,来区分前后端及相关资源

nginx中location相关配置

  1. = 表示进行普通字符串精确匹配。 location ~ /bbp {}
  2. ^~ 表示匹配路径前缀,如果找到则停止搜索。location ^~ /bbq {}
  3. ~* 表示执行一个正则匹配,不区分大小写 location ~* /bbq {}
  4. ~ 表示执行一个正则匹配,区分大小写 location ~ /bbq {}
  5. 普通路径前缀匹配,如:location /bbq { }

从1到5,优先级逐渐降低。

配置中相关注意点

  1. alias与root的区别。
    root: 用于指定文件目录,将URI附加到指定的根路径上,生成一个完整的文件系统。

    location /documents {
        root /var/wwww;
        # 当请求 /documents/report.pdf时,nginx会将URI附加到root后,在服务器的/var/www/documents/report.pdf路径找文件。
    }
    

    alias: 用于替换URI中的一部分到指定路径。

    location /documents {
        alias /var/www/documents;
        # 当请求/documents/report.pdf时,nginx会将匹配到/documents部分替换为指定路径:/var/www/documents/report.pdf
    }
    location /test {
        alias /var/www/documents;
        # 当请求/test/report.pdf时,最终访问路径:/var/www/documents/report.pdf
    }
    
  2. index 与 try_files区别。 try_files用于按照顺序检查文件或URI的存在性,并返回第一个找到的文件或URI。如果所有指定的文件或URI都不存在,则执行最后一个参数,它通常是一个URI或返回的状态码。
    例如:

    location / {
        try_files $uri $uri/ /index.html
        # 1.先尝试将$uri当文件来处理 
        # 2.尝试将$uri当作目录来处理
        # 3.如果前两步都失败,则返回/index.html
    }
    

    注:uringinx的一个内置变量,表示当前请求的URIUniformResourceIdentifier,即统一资源标识符)。http请求中,URL通常是请求的URL中主机名和端口号之后的部分,包括查询字符串。>例如:http://example.com/path/to/resource?param1=value1>uri 是nginx的一个内置变量,表示当前请求的URI(Uniform Resource Identifier,即 统一资源标识符)。http请求中,URL通常是请求的URL中主机名和端口号之后的部分,包括查询字符串。 > 例如:http://example.com/path/to/resource?param1=value1中 > uri 指:/path/to/resource?param1=value

index 用于定义当前请求的是目录时,Nginx应该返回哪个文件作为默认索引文件。 例如:

     location / {
         root /var/www/example.com
         index index.html index.htm
         # 例如请求一个目录/test/ 并且没有指定具体的文件名时:
         # 1.先行查找index.html
         # 2.没找到找index.htm
     }