Nginx Location映射规则总结归纳

[复制链接]
发表于 2025-5-24 09:47:36 | 显示全部楼层 |阅读模式
❃博主首页 :   「码到三十五」   ,同名公众号 :「码到三十五」,wx号 : 「liwu0213」   
  ☠博主专栏 :   <mysql高手>    <elasticsearch高手>    <源码解读>    <java核心>    <面试攻关>   
  ♝博主的话 :  搬的每块砖,皆为峰峦之基;公众号搜索「码到三十五」关注这个爱发技能干货的coder,一起筑基   
Nginx的location指令是设置哀求路由的核心机制,其匹配规则直接影响哀求的处理流程。下面基于官方文档和实战经验的总结:
一、Location匹配规则与优先级

1. 匹配模式
Nginx支持5种location修饰符,优先级从高到低为:
修饰符阐明示例=精确匹配(最高优先级)location = /logo.png^~最长前缀匹配(匹配后停止正则查抄)location ^~ /static/~正则匹配(区分大小写,按设置文件顺序匹配)location ~ \.php$~*正则匹配(不区分大小写)`location ~* .(jpg无平常前缀匹配(按最长匹配原则,优先级最低)location /blog/ 2. 优先级顺序
Nginx按以下顺序匹配location块:

  • 精确匹配(=)
    仅当哀求URI与location后的字符串完全匹配时生效。
  • 正则匹配(~/~*)
    按设置文件中的书写顺序依次匹配,首个匹配的正则生效。
  • 最长前缀匹配(^~)
    选择匹配URI前缀最长的location块。
  • 平常前缀匹配
    按最长匹配原则选择,若多个location匹配,选择开始界说的。
  • 默认匹配(location /)
    兜底处理未匹配其他规则的哀求。
3. 匹配示例
假设设置如下:
  1. location = /exact { ... }          # 精确匹配
  2. location ^~ /prefix { ... }        # 最长前缀匹配
  3. location ~ \.png$ { ... }          # 正则匹配(区分大小写)
  4. location /general { ... }          # 普通前缀匹配
  5. location / { ... }                 # 默认匹配
复制代码


  • 哀求/exact → 匹配location = /exact。
  • 哀求/prefix/long → 匹配location ^~ /prefix(^~优先级高于平常前缀)。
  • 哀求/image.PNG → 匹配location ~* \.(jpg|png)$(不区分大小写的正则)。
  • 哀求/general/path → 匹配location /general。
二、Proxy_pass路径处理规则

proxy_pass指令用于将哀求转发到后端服务,其路径拼接逻辑与location设置精密相关
1. 路径拼接规则
场景示例设置哀求URI转发目标proxy_pass带/结尾location /api/ { proxy_pass http://backend/; }/api/userhttp://backend/userproxy_pass不带/location /api { proxy_pass http://backend; }/api/userhttp://backend/api/user正则locationlocation ~ ^/app/(.*) { proxy_pass http://app/$1; }/app/v1/datahttp://app/v1/data 关键规则


  • 带/:proxy_pass的URL以/结尾时,替换location匹配的部门。
  • 不带/:proxy_pass的URL不带/时,追加location匹配后的完整路径。
2. 路径截取与重写
通过rewrite指令可动态修改转发路径:
  1. location ~* ^/api/v1/ {
  2.     rewrite ^/api/v1/(.*) /$1 break;  # 截取/api/v1/后的路径
  3.     proxy_pass http://backend;
  4. }
复制代码


  • 哀求/api/v1/user/123 → 转发到http://backend/user/123。
3. 特别场景处理


  • Unix Socket转发
    1. location /unix/ {
    2.     proxy_pass http://unix:/var/run/backend.sock:/;
    3. }
    复制代码
  • 制止301重定向
    1. location /app {
    2.     proxy_pass http://backend;
    3. }
    4. # 请求/app(无结尾/)时,Nginx可能自动重定向到/app/
    5. # 使用精确匹配避免:
    6. location = /app {
    7.     proxy_pass http://backend;
    8. }
    复制代码
三、设置优化与最佳实践


  • 精确匹配优先
    将location =块置于设置文件顶部,减少正则匹配开销。
  • 正则匹配顺序
    将高频哀求的正则规则前置,提升匹配效率。
  • 路径计划同等性
    确保location和proxy_pass的URL格式(是否带/)同等,制止路径拼接错误。
  • 监控监控
    使用error_log和access_log跟踪匹配过程,优化设置。
四、完整设置示例

  1. server {
  2.     listen 80;
  3.     server_name example.com;
  4.     # 精确匹配静态文件
  5.     location = /favicon.ico {
  6.         log_not_found off;
  7.         access_log off;
  8.         root /var/www/icons;
  9.     }
  10.     # 最长前缀匹配API请求
  11.     location ^~ /api/ {
  12.         proxy_pass http://api_server;
  13.         proxy_set_header Host $host;
  14.         proxy_set_header X-Real-IP $remote_addr;
  15.     }
  16.     # 正则匹配图片资源(不区分大小写)
  17.     location ~* \.(jpg|png|gif)$ {
  18.         expires 30d;
  19.         root /var/www/images;
  20.     }
  21.     # 默认匹配
  22.     location / {
  23.         root /var/www/html;
  24.         index index.html;
  25.     }
  26. }
复制代码
设置阐明

  • 精确匹配favicon.ico,关闭日志日志提升性能
  • ^~ /api/匹配所有以/api/开头的哀求,转发到后端服务。
  • 正则匹配图片文件,设置30天缓存。
  • 未匹配的哀求由location /处理,返回静态文件。

    关注公众号[码到三十五]获取更多技能干货 !   


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表