SHIHUC

好记性不如烂笔头,还可以分享给别人看看! 专注基础算法,互联网架构,人工智能领域的技术实现和应用。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

nginx的url规则小tips

Posted on 2018-01-11 19:25  shihuc  阅读(469)  评论(0编辑  收藏  举报

背景信息:

被代理的服务器(10.90.7.2)上,nginx的配置内容

server {
    listen  9000; 
    server_name localhost;
    default_type text/html;

    location /path1 {
       root html; 
       index index.html;
    } 
    location /path1/path2 { 
       root html; 
       index index.html;
    }

}

待访问的页面路径信息如下:

[root@localhost html]# pwd
/usr/local/nginx/html
[root@localhost html]# cd path1/
[root@localhost path1]# tree
.
|-- index.html
`-- path2
    `-- index.html

1 directory, 2 files

单独访问10.90.7.2这个服务器的path1以及path2的效果如下图:

 

1.在前端代理服务器10.90.7.10的nginx.conf中proxy_pass后面不带/,location 对应的url后面也不带/

upstream backend_slash {
    server 10.90.7.2:9000;
}

server {
    listen  9000;
    server_name     localhost;

    default_type text/html;

    location /path1 {
        proxy_pass http://backend_slash;
        proxy_set_header Host $host:$server_port;
        proxy_set_header Remote_Addr $remote_addr;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

访问10.90.7.10:9000/path1的path1,效果如图:

 

2.在前端代理服务器10.90.7.10的nginx.conf中proxy_pass后面不带/,location 对应的url后面带/

upstream backend_slash {
    server 10.90.7.2:9000;
}

server {
    listen  9000;
    server_name     localhost;

    default_type text/html;

    location /path1/ {
        proxy_pass http://backend_slash;
        proxy_set_header Host $host:$server_port;
        proxy_set_header Remote_Addr $remote_addr;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

访问10.90.7.10:9000/path1的path1,效果如下图,其实和步骤1中的效果一样.

 

3. 在前端代理服务器10.90.7.10的nginx.conf中proxy_pass后面带/,location 对应的url中加入虚拟路径前缀path,后面不带/

upstream backend_slash {
    server 10.90.7.2:9000;
}

server {
    listen  9000;
    server_name     localhost;

    default_type text/html;

    location /path {
        proxy_pass http://backend_slash/;
        proxy_set_header Host $host:$server_port;
        proxy_set_header Remote_Addr $remote_addr;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

访问10.90.7.10:9000/path/path1的path1,效果如下图,效果和步骤1,2的一样。

当访问10.130.7.10:9000/path1/path2时,效果如下图:

被代理的服务器10.90.7.2上nginx的error日志内容:

2018/01/11 14:41:43 [error] 20333#0: *52 "/usr/local/nginx/html/1/path2/index.html" is not found (20: Not a directory), client: 10.90.7.10, server: localhost, request: "GET /1/path2/ HTTP/1.0", host: "10.90.7.10:9000"

 

4. 在前端代理服务器10.90.7.10的nginx.conf中proxy_pass后面不带/,location 对应的url中加入虚拟路径前缀path,后面也不带/

upstream backend_slash {
    server 10.90.7.2:9000;
}

server {
    listen  9000;
    server_name     localhost;

    default_type text/html;

    location /path {
        proxy_pass http://backend_slash;
        proxy_set_header Host $host:$server_port;
        proxy_set_header Remote_Addr $remote_addr;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

访问10.90.7.10:9000/path/path1的path1,效果如下图:

 

5. 在前端代理服务器10.90.7.10的nginx.conf中proxy_pass后面带/,location 对应的url中加入虚拟路径前缀path,后面也带/

upstream backend_slash {
    server 10.90.7.2:9000;
}

server {
    listen  9000;
    server_name     localhost;

    default_type text/html;

    location /path/ {
        proxy_pass http://backend_slash/;
        proxy_set_header Host $host:$server_port;
        proxy_set_header Remote_Addr $remote_addr;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

访问10.90.7.10:9000/path/path1的path1,效果如图

访问10.90.7.10:9000/path1/path2的path2,效果如下图:

这里要说明一下的,我这里10.90.7.10这个服务器的server (端口9000),是没有配置location / {root html; index index.html;}这么一个规则的,但是依然可以访问到这个服务器下html下面的path1/path2. 

为什么呢? 这里要注意下,nginx默认都会有一个 location / {root html; index index.html;}的规则.

 

访问10.90.7.10:9000/path/path1/path2的path2,效果如图:

 

 

综上总结:

1. proxy_pass 后面的url中带上反斜线,和不带反斜线效果差异很大,带反斜线时会将location里面指定的url前缀去掉。

2. location后面的url前缀部分后缀带不带反斜线,效果差异截然不同。

3. nginx的虚拟服务器server的配置中,没有配置默认的location / {}时,默认会有一个location / {root html; index index.html;}