zoukankan      html  css  js  c++  java
  • nginx的url规则小tips

    背景信息:

    被代理的服务器(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;}

  • 相关阅读:
    Go 指针
    Go 字符串
    Go Maps
    Go 可变参数函数
    Go 数组和切片
    pyqt5实现窗口跳转并关闭上一个窗口
    spy++查找窗口句柄
    Python中Tk模块简单窗口设计
    pyqt5无边框拖动
    pyqt5 GUI教程
  • 原文地址:https://www.cnblogs.com/shihuc/p/8270226.html
Copyright © 2011-2022 走看看