Nginx Location映射规则总结归纳

❃博主首页 : 「码到三十五」 ,同名公众号 :「码到三十五」,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块:

  1. 精确匹配(=
    仅当请求URI与location后的字符串完全匹配时生效。
  2. 正则匹配(~/~*
    按配置文件中的书写顺序依次匹配,首个匹配的正则生效。
  3. 最长前缀匹配(^~
    选择匹配URI前缀最长location块。
  4. 普通前缀匹配
    按最长匹配原则选择,若多个location匹配,选择最先定义的。
  5. 默认匹配(location /
    兜底处理未匹配其他规则的请求。

3. 匹配示例
假设配置如下:

location = /exact { ... }          # 精确匹配
location ^~ /prefix { ... }        # 最长前缀匹配
location ~ \.png$ { ... }          # 正则匹配(区分大小写)
location /general { ... }          # 普通前缀匹配
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/user
proxy_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指令可动态修改转发路径:

location ~* ^/api/v1/ {
    rewrite ^/api/v1/(.*) /$1 break;  # 截取/api/v1/后的路径
    proxy_pass http://backend;
}
  • 请求/api/v1/user/123 → 转发到http://backend/user/123

3. 特殊场景处理

  • Unix Socket转发
    location /unix/ {
        proxy_pass http://unix:/var/run/backend.sock:/;
    }
    
  • 避免301重定向
    location /app {
        proxy_pass http://backend;
    }
    # 请求/app(无结尾/)时,Nginx可能自动重定向到/app/
    # 使用精确匹配避免:
    location = /app {
        proxy_pass http://backend;
    }
    
三、配置优化与最佳实践
  1. 精确匹配优先
    location =块置于配置文件顶部,减少正则匹配开销。
  2. 正则匹配顺序
    将高频请求的正则规则前置,提升匹配效率。
  3. 路径设计一致性
    确保locationproxy_pass的URL格式(是否带/)一致,避免路径拼接错误。
  4. 监控
    使用error_logaccess_log跟踪匹配过程,优化配置。
四、完整配置示例
server {
    listen 80;
    server_name example.com;

    # 精确匹配静态文件
    location = /favicon.ico {
        log_not_found off;
        access_log off;
        root /var/www/icons;
    }

    # 最长前缀匹配API请求
    location ^~ /api/ {
        proxy_pass http://api_server;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

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

    # 默认匹配
    location / {
        root /var/www/html;
        index index.html;
    }
}

配置说明

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

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

### Tomcat 中出现 404 错误的原因分析 当遇到 Tomcat 访问返回 `404 Not Found` 的错误时,通常意味着请求的资源未能被正确定位。具体原因可以归纳为以下几个方面: #### 工程未正常部署 Tomcat 未正常启动或工程未正确部署可能导致此问题。有时,在修改跳转地址后,Tomcat 并不会自动更新源地址,这可能是由于软件 Bug 导致[^2]。 #### 跳转路径设置不当 如果应用程序中的 URL 映射配置不正确,则会引发找不到目标页面的情况。这种情况下,应该仔细核对 web 应用程序内部链接以及外部访问路径是否匹配预期设定。 #### Eclipse IDE 特定配置问题 对于通过 Eclipse 开发环境运行的应用来说,可能存在一些特定于该IDE 的配置失误。例如,项目的 facet 设置可能影响到应用能否顺利加载至容器内[^4]。 ### 解决方案建议 针对上述提到的各种可能性,以下是相应的解决方案: #### 清理并重置工作空间 移除位于 `webapps` 和 `work/Catalina/localhost` 文件夹下的旧版本项目文件,并尝试再次发布新构建好的WAR包来覆盖原有内容。这样做有助于排除因缓存残留而引起的冲突。 #### 审查URL映射规则 确认所有的转发、重定向逻辑均按照实际需求编写无误;同时也要确保所使用的端口号与服务监听的一致性。另外还需注意上下文根(Context Path)定义是否准确反映了当前站点结构。 #### 修改Eclipse项目属性 打开 `.settings/org.eclipse.wst.common.project.facet.core.xml` 文件,调整其中有关 Java EE Facets 的描述使之适应最新的开发标准或是兼容性的要求。 ```xml <faceted-project> <!-- 更新JavaEE版本 --> </faceted-project> ``` #### Nginx反向代理配置验证 如果是经过Nginx作为前端进行流量分发的话,请务必检查其location block部分是否有遗漏或者拼写上的差错。特别是涉及到PHP脚本执行的时候更要注意fastcgi参数传递准确性[^5]。 ```nginx server { listen 80; server_name localhost; location / { proxy_pass http://127.0.0.1:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码到三十五

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值