it编程 > 数据库 > Mysql

Nginx路径匹配的配置指南

19人参与 2025-07-18 Mysql

nginx的location配置,你是“迷路小菜鸟”还是“火箭工程师”?

你有没有遇到过这些“坑”:

这就是 nginx的location匹配规则 的“魔法”!它让你的请求处理像“高速公路”一样高效,像“瑞士军刀”一样灵活。

本文将带你从 “迷路小菜鸟”“火箭工程师”,手把手教你写出“神级配置”!

第一战:基础操作——“快递分拣站”的规则

1.1 精确匹配(=):快递员的“人脸识别”

问题:只有完全相同的路径才能触发配置?

解决方案:用 = 实现精确匹配!

# 精确匹配 /favicon.ico
location = /favicon.ico {
    root /var/www/static;  # 指定静态文件路径
    expires 30d;           # 浏览器缓存30天
}

# 请求示例:
# ✅ 匹配:http://example.com/favicon.ico
# ❌ 不匹配:http://example.com/favicon.ico?version=1

注释

1.2 前缀匹配(无修饰符):快递员的“地址模糊搜索”

问题:想匹配所有以 /api 开头的请求?

解决方案:用 普通前缀匹配

# 匹配所有以 /api 开头的路径
location /api {
    proxy_pass http://backend_api;  # 反向代理到后端api
}

# 请求示例:
# ✅ 匹配:/api/user、/api/v1/login
# ❌ 不匹配:/apicheck(因为开头不是/api)

注释

第二战:正则匹配——“快递员的魔法滤镜”

2.1 区分大小写的正则匹配(~):快递员的“显微镜”

问题:想区分 .jpg.jpg

解决方案:用 ~ 实现区分大小写的正则匹配!

# 匹配以 .jpg 结尾的图片(区分大小写)
location ~ \.jpg$ {
    root /var/www/images;
    expires 30d;
}

# 请求示例:
# ✅ 匹配:/photo.jpg
# ❌ 不匹配:/photo.jpg

注释

2.2 不区分大小写的正则匹配(~*):快递员的“全息扫描”

问题:想同时匹配 .jpg.jpg.png

解决方案:用 ~* 实现不区分大小写的正则匹配!

# 匹配所有图片格式(不区分大小写)
location ~* \.(jpg|png|gif)$ {
    root /var/www/images;
    expires 30d;
}

# 请求示例:
# ✅ 匹配:/logo.png、/banner.gif

注释

第三战:优先级规则——“快递员的vip通道”

3.1 优先级顺序:从“皇帝”到“平民”

问题:为什么我的正则匹配被前缀匹配覆盖了?

解决方案:牢记 优先级顺序

# 精确匹配(皇帝级)
location = / {
    root /var/www/html;
}

# 最长前缀匹配(王侯级)
location ^~ /static/ {
    root /var/www/static;
}

# 正则匹配(士大夫级)
location ~ \.php$ {
    proxy_pass http://php_backend;
}

# 普通前缀匹配(平民级)
location / {
    root /var/www/html;
}

注释

第四战:实战案例——“快递分拣站”的终极挑战

4.1 场景:电商系统的动静分离

需求

解决方案

# 静态资源:不区分大小写的正则匹配
location ~* \.(css|js|png|jpg|gif)$ {
    root /var/www/static;
    expires 30d;
}

# api请求:最长前缀匹配(优先于正则)
location ^~ /api/ {
    proxy_pass http://backend_api;
}

# 默认请求:普通前缀匹配
location / {
    root /var/www/html;
    index index.html;
}

注释

第五战:避坑指南——“快递员的防雷手册”

5.1 坑点1:斜杠的“隐形炸弹”

问题:为什么 /api/api/ 会匹配不同的配置?

解决方案:统一路径结尾的斜杠!

# 坑点示例
location /api {
    proxy_pass http://backend_api;  # 匹配 /api 和 /apic
}

location /api/ {
    proxy_pass http://backend_api_v2;  # 仅匹配 /api/
}

# 建议:统一用 ^~ 避免歧义
location ^~ /api {
    proxy_pass http://backend_api;
}

注释

5.2 坑点2:正则匹配的“顺序诅咒”

问题:为什么第一个正则匹配的配置总是生效?

解决方案:按优先级排序!

# 错误示例:正则顺序颠倒
location ~ \.jpg$ { ... }  # 会被后面的覆盖!
location ~ \.png$ { ... }  # 实际生效

# 正确示例:按重要性排序
location ~ \.png$ { ... }  # 更重要的匹配放前面
location ~ \.jpg$ { ... }

注释

第六战:高级技巧——“快递员的黑科技”

6.1 使用 map 实现动态路由

问题:想根据路径动态选择后端服务器?

解决方案:用 map 指令

# 定义变量 $backend,根据路径动态选择后端
map $uri $backend {
    default http://default-backend;
    "~^/xianyang/" http://xianyang-backend;
    "~^/api/" http://api-backend;
}

server {
    listen 80;

    location / {
        proxy_pass $backend;  # 动态选择后端
    }
}

注释

6.2 使用 try_files 实现优雅降级

问题:想先检查静态文件是否存在,否则返回404?

解决方案:用 try_files

location / {
    try_files $uri $uri/ /index.html;  # 先找文件,再找目录,最后返回首页
}

注释

常见问题:你问我答

q:为什么我的 /api 路径匹配了 /apic
a:

q:如何强制重定向到带斜杠的路径?
a:

q:正则匹配为什么比前缀匹配优先级低?
a:

结论:成为nginx的“location大师”

通过本文的七个步骤,你已经掌握了:

  1. 精确匹配= 的“人脸识别”能力。
  2. 前缀匹配:普通前缀和 ^~ 的“地址模糊搜索”。
  3. 正则匹配~~* 的“魔法滤镜”。
  4. 优先级规则:从“皇帝”到“平民”的匹配顺序。
  5. 实战案例:电商系统的动静分离配置。
  6. 避坑指南:斜杠陷阱和正则顺序诅咒。
  7. 高级技巧maptry_files 的“黑科技”。

最后的小彩蛋
如果你在开发一个“多租户系统”,记得用 map 根据子域名动态选择配置,用 ^~ 隔离公共资源路径!

以上就是nginx路径匹配的配置指南的详细内容,更多关于nginx路径匹配的资料请关注代码网其它相关文章!

(0)

您想发表意见!!点此发布评论

推荐阅读

K8s使用kubectl访问api-server失败,node“XXX“ not found的解决方案

07-18

MySQL 数据库空间使用大小查询的方法实现

07-18

MySQL查询优化与事务实战教程

07-18

mysql中in操作符的用法详解

07-19

MySQL字符串常用函数详解

07-19

MySQL中WITH ROLLUP的具体使用

07-17

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论