nginx 的 location 模块

目录

一、匹配规则

1.基础匹配

2.精确匹配

3.前缀匹配

4.正则表达式匹配

二、优先级顺序

三、示例

1.精确匹配

2.前缀匹配

3.正则匹配

4.默认匹配

第一种情况:proxy_pass最后面没有斜杠,匹配路径有斜杠(/bbb/)

[第二种情况: proxy_pass最后面有斜杠 "/",匹配路径也有斜杠(/bbb/)](#第二种情况: proxy_pass最后面有斜杠 “/”,匹配路径也有斜杠(/bbb/))

[第三种情况:proxy_pass后面还有其他路径但是最后没有 "/", 匹配路径也有斜杠(/bbb/)](#第三种情况:proxy_pass后面还有其他路径但是最后没有 “/”, 匹配路径也有斜杠(/bbb/))

[第四种情况: proxy_pass后面还有其他路径但是最后有 "/", 匹配路径也有斜杠(/bbb/)](#第四种情况: proxy_pass后面还有其他路径但是最后有 “/”, 匹配路径也有斜杠(/bbb/))

[第五种情况:location匹配路径末尾没有 "/",proxy_pass后面也没有"/"](#第五种情况:location匹配路径末尾没有 “/”,proxy_pass后面也没有“/”)


一、匹配规则

1.基础匹配

  • location / { ... }:这是最基本的匹配,匹配所有请求。因为它没有指定具体的文件或目录,所以通常作为后备选项出现。

2.精确匹配

  • location = /exact/path { ... }:精确匹配这个路径。如果请求的 URI 完全等于 /exact/path,则使用这个 location 块的配置处理此请求。这具有最高的优先级。

3.前缀匹配

  • location /prefix/ { ... }:前缀匹配请求的 URI 的开始部分。如果请求的 URI 以 /prefix/ 开始,这个 location 块将被用来处理请求。
  • location ^~ /prefix/ { ... }:前缀匹配,但它会停止正则表达式匹配,即使正则表达式可能会更具体匹配。如果该 location 匹配,Nginx 不会考虑之后的正则 location 块。

4.正则表达式匹配

  • location ~ /regex/ { ... }:大小写敏感的正则匹配。
  • location ~* /regex/ { ... }:大小写不敏感的正则匹配。
  • location / { ... } 正则表达式匹配会在普通字符串前缀匹配后进行。如果有多个正则表达式 location 都匹配请求,则使用第一个匹配的 location 块。

二、优先级顺序

Nginx 处理请求时 location 匹配的优先级顺序如下:

  1. 首先进行精确匹配 location =
  2. 其次按文件中出现顺序匹配所有正则表达式 location ~location ~*
  3. 然后进行最长的前缀匹配 location ^~
  4. 最后是通常的前缀匹配 location /prefix/
  5. 如果前面的匹配都没有找到,就使用默认的 location /

三、示例

1.精确匹配

bash 复制代码
server {
    listen 80;
    listen [::]:80;
    server_name welcome.com;
    access_log /etc/nginx/vhost/logs/access_welcome.log;
    error_log /etc/nginx/vhost/logs/error_welcome.log;
    
    location /test.html {
        root /usr/share/nginx/html;
    }

    location = /test.html {
        #通过 root 路径,会将条件拼接进来
        root /var/www/html;
        index index.html;
    }

    error_page 404 /404.html;    
    location = /404.html {
        root /usr/share/nginx/test_html;
    }
    
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    }
}
# 第一个和第二个location匹配条件一样,都是/test.html
# 但第二个为精准匹配到静态路径,因此第一个不会执行,会执行第二个。
bash 复制代码
server {
    listen 80;
    listen [::]:80;
    server_name welcome.com;
    access_log /etc/nginx/vhost/logs/access_welcome.log;
    error_log /etc/nginx/vhost/logs/error_welcome.log;
    
    location /test.html {
       #通过alias指定路径,无需拼接条件
       #alias指定的路径结尾要加"/"
       alias /usr/share/nginx/test_html/;
    }

    error_page 404 /404.html;    
    location = /404.html {
        root /usr/share/nginx/test_html;
    }
    
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    }
}

# 指定静态资源路径除了使用关键字root,还可以用alias。
# 那么root和alias的区别是什么?
# 用root属性指定的值是要加入到最终路径中的,匹配条件会拼接到路径中
# 用alias属性指定的值不需要加入到最终路径中

# 请求的条件为test.html,通过root指定的路径为/usr/share/nginx/test_html,因此在匹配的时候,这个路径下就必须要有test.html这个文件才可以,否则就会找不到而报错,如果用alias,那么通过浏览器进行请求的时候,alias也是指定到/usr/share/nginx/test_htm路径下,但是会匹配默认的index.html,而无须强制匹配test.html。

# 不能使用"="来进行精确匹配

2.前缀匹配

bash 复制代码
server {
    listen 80;
    listen [::]:80;
    server_name welcome.com;
    access_log /etc/nginx/vhost/logs/access_welcome.log;
    error_log /etc/nginx/vhost/logs/error_welcome.log;
    
    location ^~ /a/ {
        root /data/webroot/;
    }

    location ^~ /a/www/ {
        root /data/webroot/;
    }
    
}

# 当请求为 http://welcome.com/a/ 时,访问 /data/webroot/a/ 下的index.html文件
# 当请求为 http://welcome.com/a/www/ 时,访问 /data/webroot/a/www/ 下的index.html文件
# 如果^~匹配成功了,那么表示阻断正则表达式,不再进行正则匹配

3.正则匹配

bash 复制代码
# 正则表达式匹配,大小写敏感
server {
    listen 80;
    listen [::]:80;
    server_name welcome.com;
    access_log /etc/nginx/vhost/logs/access_welcome.log;
    error_log /etc/nginx/vhost/logs/error_welcome.log;
    
    location ~ \.(gif|jpg|png)$ {
        root /var/www/images;
    }

    error_page 404 /404.html;    
    location = /404.html {
        root /usr/share/nginx/test_html;
    }
    
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    }
}
bash 复制代码
# 正则表达式匹配,大小写不敏感
server {
    listen 80;
    listen [::]:80;
    server_name welcome.com;
    access_log /etc/nginx/vhost/logs/access_welcome.log;
    error_log /etc/nginx/vhost/logs/error_welcome.log;
    
    location ~* \.(css|js)$ {
        root /var/www/assets;
    }

    error_page 404 /404.html;    
    location = /404.html {
        root /usr/share/nginx/test_html;
    }
    
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    }
}

4.默认匹配

第一种情况:proxy_pass最后面没有斜杠,匹配路径有斜杠(/bbb/)

bash 复制代码
server {
    listen 80;
    listen [::]:80;
    server_name welcome.com;
    access_log /etc/nginx/vhost/logs/access_welcome.log;
    error_log /etc/nginx/vhost/logs/error_welcome.log;
    
    #默认匹配
    location /bbb/ {
        proxy_pass http://127.0.0.1:9190;
        proxy_redirect    off;
        proxy_set_header    Host $host;
        proxy_set_header    X-Real-IP $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}

# proxy_pass最后面没有斜杠"/",此时通过浏览器请求http://10.9.2.248/bbb/
# 那么实际访问的地址就是 http://127.0.0.1:9190/bbb/,会将匹配路径/bbb一起加过去。

第二种情况: proxy_pass最后面有斜杠 "/",匹配路径也有斜杠(/bbb/)

bash 复制代码
server {
    listen 80;
    listen [::]:80;
    server_name welcome.com;
    access_log /etc/nginx/vhost/logs/access_welcome.log;
    error_log /etc/nginx/vhost/logs/error_welcome.log;
    
    #默认匹配
    location /bbb/ {
        proxy_pass http://127.0.0.1:9190/;
        proxy_redirect    off;
        proxy_set_header    Host $host;
        proxy_set_header    X-Real-IP $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}
# proxy_pass最后面有斜杠"/",此时通过浏览器请求http://10.9.2.248/bbb/
# 那么实际访问的地址就是 http://127.0.0.1:9190,会将/bbb抛弃的,

第三种情况:proxy_pass后面还有其他路径但是最后没有 "/", 匹配路径也有斜杠(/bbb/)

bash 复制代码
server {
    listen 80;
    listen [::]:80;
    server_name welcome.com;
    access_log /etc/nginx/vhost/logs/access_welcome.log;
    error_log /etc/nginx/vhost/logs/error_welcome.log;
    
    #默认匹配
    location /bbb/ {
        proxy_pass http://127.0.0.1:9190/ccc;
        proxy_redirect    off;
        proxy_set_header    Host $host;
        proxy_set_header    X-Real-IP $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
# 通过浏览器访问http://10.9.2.248/bbb/index.html
# 实际请求的是http://127.0.0.1/index.html
# 位置是默认路径下,不是ccc路径下
# 如果proxy_pass的路径为/ccc/ddd,那么实际请求的就是ccc路径下的cccindex.html

第四种情况: proxy_pass后面还有其他路径但是最后有 "/", 匹配路径也有斜杠(/bbb/)

bash 复制代码
server {
    listen 80;
    listen [::]:80;
    server_name welcome.com;
    access_log /etc/nginx/vhost/logs/access_welcome.log;
    error_log /etc/nginx/vhost/logs/error_welcome.log;
    
    #默认匹配
    location /bbb/ {
        proxy_pass http://127.0.0.1:9190/ccc/;
        proxy_redirect    off;
        proxy_set_header    Host $host;
        proxy_set_header    X-Real-IP $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
# 通过浏览器访问:http://10.9.2.248/bbb/index.html,
# 实际访问的是http://127.0.0.1/ccc/index.html

第五种情况:location匹配路径末尾没有 "/",proxy_pass后面也没有"/"

bash 复制代码
server {
    listen 80;
    listen [::]:80;
    server_name welcome.com;
    access_log /etc/nginx/vhost/logs/access_welcome.log;
    error_log /etc/nginx/vhost/logs/error_welcome.log;
    
    #默认匹配
    location /bbb {
        proxy_pass http://127.0.0.1:9190;
        proxy_redirect    off;
        proxy_set_header    Host $host;
        proxy_set_header    X-Real-IP $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
# 匹配路径和proxy_pass后都没有"/"
# 访问http://10.9.2.248/bbb
# 默认将请求到http://127.0.0.1:9190/bbb/index.html的内容
相关推荐
JeffersonZU几秒前
Linux/Unix 套接字Socket编程(socket基本概念,流程,流式/数据报socket,Unix domain socket示例)
linux·c语言·tcp/ip·udp·unix·gnu
先做个垃圾出来………23 分钟前
自动化一次通过率
运维·自动化
Two_brushes.1 小时前
【linux网络】网络编程全流程详解:从套接字基础到 UDP/TCP 通信实战
linux·开发语言·网络·tcp/udp
夕泠爱吃糖1 小时前
Linux中的静态库和动态库
linux·运维·服务器
Vic101011 小时前
Java 开发笔记:多线程查询逻辑的抽象与优化
java·服务器·笔记
比奥利奥还傲.2 小时前
Linux运维安全新范式:基于TCPIP与SSH密钥的无密码认证实战
linux·运维·安全
moppol3 小时前
探索下一代云存储技术:对象存储、文件存储与块存储的区别与选择
服务器
mmsx3 小时前
使用git生成ssh的ed25519密钥
运维·git·ssh
ZeroNews内网穿透3 小时前
服装零售企业跨区域运营难题破解方案
java·大数据·运维·服务器·数据库·tcp/ip·零售
果子⌂4 小时前
容器技术入门之Docker环境部署
linux·运维·docker