Nginx Location匹配与Proxy_pass匹配规则

Nginx Location匹配与Proxy_pass

1. Location 匹配规则

1.1 基本语法

bash 复制代码
location [修饰符] 匹配模式 {
    # 配置指令
}

1.2 匹配模式类型

1.2.1 精确匹配 (=)
bash 复制代码
location = /api {
    # 只匹配 /api,不匹配 /api/ 或 /api/xxx
}
1.2.2 前缀匹配 (无修饰符)

带斜杠的匹配:

bash 复制代码
location /prefix/ {
    # 匹配以 /prefix/ 开头的 URI
    # 示例:/prefix/user → 匹配 ✅
    # 示例:/prefixother → 不匹配 ❌
}

不带斜杠的匹配:

bash 复制代码
location /prefix {
    # 匹配任何以 /prefix 开头的 URI
    # 示例:/prefix/user → 匹配 ✅
    # 示例:/prefixother → 匹配 ✅ (可能产生意外匹配)
}

1.2.3 正则匹配 (~, ~*)

bash 复制代码
location ~ \.php$ {
    # 匹配以 .php 结尾的 URI (区分大小写)
}

location ~* \.(jpg|png)$ {
    # 匹配以 jpg 或 png 结尾的 URI (不区分大小写)
}

1.3 匹配优先级

= 精确匹配 (最高优先级)

^~ 前缀匹配

~ 和 ~* 正则匹配 (按配置顺序)

普通前缀匹配 (最长匹配优先)

2. Proxy_pass 代理规则

2.1 Proxy_pass 基本语法

bash 复制代码
proxy_pass http://backend_server;

2.2 路径替换规则

2.2.1 Proxy_pass 以 / 结尾会替换 location 匹配的部分
bash 复制代码
 #配置 A
location /app/ {
    proxy_pass http://192.168.1.10:8080/;
}

#请求:/app/user/list
#转发:http://192.168.1.10:8080/user/list
#location 匹配部分 /app/ 被替换为 /
bash 复制代码
# 配置 B  
location /app {
    proxy_pass http://192.168.1.10:8080/;
}

# 请求:/app/user/list
# 转发:http://192.168.1.10:8080//user/list
# location 匹配部分 /app 被替换为 /,产生双斜杠
2.2.2 Proxy_pass 不以 / 结尾会保留完整路径
bash 复制代码
# 配置 C
location /api/ {
    proxy_pass http://192.168.1.11:3000;
}

# 请求:/api/v1/users
# 转发:http://192.168.1.11:3000/api/v1/users
# 完整路径被保留
bash 复制代码
# 配置 D
location /api {
    proxy_pass http://192.168.1.11:3000;
}

# 请求:/api/v1/users
# 转发:http://192.168.1.11:3000/api/v1/users
# 完整路径被保留

2.3 完整示例对比

示例 1:正确的路径处理

bash 复制代码
location /gateway/ {
    proxy_pass http://192.168.1.20:9000/;
    
    # 请求:/gateway/auth/login
    # 转发:http://192.168.1.20:9000/auth/login
    # ✅ 路径处理正确
}

示例 2:产生双斜杠问题

bash 复制代码
location /gateway {
    proxy_pass http://192.168.1.20:9000/;
    
    # 请求:/gateway/auth/login  
    # 转发:http://192.168.1.20:9000//auth/login
    # ❌ 产生双斜杠,可能导致 404
}

示例 3:保留前缀路径

bash 复制代码
location /external/ {
    proxy_pass http://192.168.1.30:8000;
    
    # 请求:/external/service/data
    # 转发:http://192.168.1.30:8000/external/service/data
    # ✅ 完整路径保留
}

3. 常见场景与最佳实践

3.1 场景 1:去除前缀代理

bash 复制代码
# 前端使用 /proxy/api,后端期望 /api
location /proxy/ {
    proxy_pass http://192.168.1.40:7000/;
    
    # 请求:/proxy/api/users
    # 转发:http://192.168.1.40:7000/api/users
}

3.2 场景 2:路径重写代理

bash 复制代码
location /v1/ {
    rewrite ^/v1/(.*)$ /api/v1/$1 break;
    proxy_pass http://192.168.1.50:6000;
    
    # 请求:/v1/users
    # 转发:http://192.168.1.50:6000/api/v1/users
}

3.3 场景 3:多路径代理

bash 复制代码
# 使用正则匹配多个路径
location ~ ^/(auth|api|admin)/ {
    proxy_pass http://192.168.1.60:5000;
    
    # 请求:/auth/login → http://192.168.1.60:5000/auth/login
    # 请求:/api/data → http://192.168.1.60:5000/api/data
}

4. 总结表格

Location 模式 Proxy_pass 格式 请求路径 转发路径 效果
location /app/ proxy_pass http://backend/; /app/user http://backend/app/user 保留前缀 ✅
location /app/ proxy_pass http://backend/; /app/user http://backend/user 去除前缀 ✅
location /app proxy_pass http://backend/; /app/user http://backend//user 双斜杠 ❌
location /app proxy_pass http://backend; /app/user http://backend/app/user 保留前缀 ✅
相关推荐
su3172 小时前
rap2部署
linux·运维·服务器
草莓熊Lotso3 小时前
Linux 基础开发工具入门:软件包管理器的全方位实操指南
linux·运维·服务器·c++·人工智能·网络协议·rpc
Jewel Q3 小时前
PowerShell 和 CMD
运维
Mr_Xuhhh3 小时前
GUI自动化测试--自动化简单示例
运维·服务器·自动化
羑悻的小杀马特3 小时前
零成本自建私人知识库教学,Leanote+Cpolar 内网穿透,手机电脑随时同步,无需云服务器,效率翻倍!
运维·服务器·coplar·leanote
chevysky.cn8 小时前
Jenkins自动部署CI/CD
运维·ci/cd·jenkins
躲猫猫的喵喵10 小时前
Ubuntu2204降内核版本
linux·运维·服务器·ubuntu
zdslovezy11 小时前
CentOS 系统升级 OpenSSH 和 OpenSSL 的完整方案
linux·运维·centos
cccccc语言我来了11 小时前
(Linux (6):从包管理到工具探索,构建系统操作基础认知)
linux·运维·服务器