玩命加载中🤣🤣🤣

Nginx Location Demo


Nginx Location Demo

环境准备

此处演示仅限本地修改

host 修改

127.0.0.1 hujiao.com

root 与 alias 的区别

两个案例

server {
    listen       80;
    server_name  localhost;

    location /blog {
        alias D:/dee_code/dee-blog-code/blog/;
        index  index.html index.htm;
    }

}

server {
    listen       2323;
    server_name  localhost;

    location / {
        root   D:/dee_code/dee-blog-code/public/;
        index  index.html index.htm;
    }

}

先说结论:

当设置 root 时, 访问 http://hujiao.com:2323/ 时,会访问 root 所指向的 D:/dee_code/dee-blog-code/public/ + location 所指向的 /

当设置 alias 时,访问 http://hujiao.com/blog/ 时,只会访问 alias 所指向的 D:/dee_code/dee-blog-code/blog/

因此如果我想将上述写法互换,需要如下改动

server {
    listen       80;
    server_name  localhost;

    location /blog {
        root D:/dee_code/dee-blog-code/;
        index  index.html index.htm;
    }

}

server {
    listen       2323;
    server_name  localhost;

    location / {
        alias   D:/dee_code/dee-blog-code/public/;
        index  index.html index.htm;
    }

}

举个demo

在 linux 环境下 /data/one/1.html 的资源

如果分别想通过 root 和 alias 应该怎么配置可以访问?

访问路径为 http://139.224.230.186/one/1.html

proxy_pass的映射

在这里我们只讨论一个问题

反向代理时 location 和 proxy_pass 后跟着的 / 到底如何映射

项目准备

核心依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>

<!--springboot web-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!--springboot test-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.17</version>
</dependency>

Controller

@RestController
@RequestMapping()
public class Start {
    @RequestMapping("/**")
    public Map test(HttpServletRequest request){
        System.out.println("requestURI() = " + request.getRequestURI());
        System.out.println("requestURL() = " + request.getRequestURL());
        return MapUtil.builder(new HashMap<String, String>())
                .put("requestURI", request.getRequestURI())
                .put("requestURL", request.getRequestURL().toString()).build();
    }
}

Nginx 配置

随便先写一种

upstream deetest {
     server hujiao.com:23323;         
}

server {
    listen       80;
    server_name  localhost;

    location /test/ {
        proxy_pass http://deetest/;
    }
}

在浏览器中访问 http://hujiao.com/test/

此时后端响应

{
"requestURL": "http://deetest/",
"requestURI": "/"
}

现在我只调整 Nginx 配置一处

upstream deetest {
     server hujiao.com:23323;         
}

server {
    listen       80;
    server_name  localhost;

    location /test/ {
        proxy_pass http://deetest;
    }
}

在浏览器中访问 http://hujiao.com/test/

此时后端响应

{
"requestURL": "http://deetest/test/",
"requestURI": "/test/"
}

探究

在这里我把它分为3类

  • proxy_pass 尾巴有 /
  • proxy_pass 尾巴没有 /
  • proxy_pass 后有路径
location /api1/ {
    proxy_pass http://deetest/;
}
location /api2 {
    proxy_pass http://deetest/;
}

location /api3/ {
    proxy_pass http://deetest;
}
location /api4 {
    proxy_pass http://deetest;
}

先分别看下效果

http://hujiao.com/api1/uriXXX
{
"requestURL": "http://deetest/uriXXX",
"requestURI": "/uriXXX"
}

http://hujiao.com/api2/uriXXX
{
"requestURL": "http://deetest//uriXXX",
"requestURI": "//uriXXX"
}

http://hujiao.com/api3/uriXXX
{
"requestURL": "http://deetest/api3/uriXXX",
"requestURI": "/api3/uriXXX"
}

http://hujiao.com/api4/uriXXX
{
"requestURL": "http://deetest//uriXXX",
"requestURI": "//uriXXX"
}

结论1

proxy_pass有/

location 只属于部分匹配, 不属于请求部分, 会在请求路径中删除

proxy_pass无 /

location 不管带不带 /, 都会将 /api 作为真实请求路径

第三种情况

location /api5/ {
    proxy_pass http://deetest/route/;
}

location /api6 {
    proxy_pass http://deetest/route/;
}
location /api7/ {
    proxy_pass http://deetest/route;
}

location /api8 {
    proxy_pass http://deetest/route;
}

效果

http://hujiao.com/api5/uriXXX
{
"requestURL": "http://deetest/route/uriXXX",
"requestURI": "/route/uriXXX"
}

http://hujiao.com/api6/uriXXX
{
"requestURL": "http://deetest/route//uriXXX",
"requestURI": "/route//uriXXX"
}

http://hujiao.com/api7/uriXXX
{
"requestURL": "http://deetest/routeuriXXX",
"requestURI": "/routeuriXXX"
}

http://hujiao.com/api8/uriXXX
{
"requestURL": "http://deetest/route/uriXXX",
"requestURI": "/route/uriXXX"
}

结论2

以第一种方式进行切割

第一个 demo 的一种配置

server {
    listen       80;
    #域名、主机名 匹配站点: 完整匹配、通配符匹配、通配符结束匹配、正则匹配
    # server_name  www.saddyfire.cn saddyfire.cn ;

    # return 301 https://$server_name$request_uri;

    server_name localhost;
    location /one/ {
        root /data/;
        index index.html;
    }
    location /two/ {
        alias /data/one/;
        index index.html;
    }
}

文章作者: 👑Dee👑
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 👑Dee👑 !
  目录