当前位置:首页 > 技术文章 > 正文内容

Nginx的Location到底是怎么匹配的?

arlanguage3个月前 (01-26)技术文章21

引言

Nginx作为一个优秀且流行的七层负载均衡软件,大量应用在互联网公司的流量入口。随着OpenResty、Kong、APISIX等Nginx生态软件的流行,Nginx也被应用到了更多的领域。

对于普通的Nginx用户来说,最常见的操作就是配置Location。当一个server配置块有多条location,并且使用了不同的修饰符时,你是否经常遇到请求实际匹配location和自己期望的location不一致的情况呢?

今天我将详细说明Location的匹配逻辑,希望你在阅读之后能够更从容的使用Nginx。

配置语法介绍

首先,我们来了解一下location指令的配置语法:

location @name { ... }
location [ = | ~ | ~* | ^~ ] uri { ... }

第一种配置语法,定义的是一个命名location,不处理常规的请求,只做内部的重定向使用。例如,error_page 404 = @fallback ,@fallback就是一个命名location。

第二种配置语法,在实际使用时的差异,在于location指令和uri之间的修饰符,一共有5种,下面分别介绍他们的含义:

  1. 使用=修饰符。在所有location中优先级最高,一旦匹配,会立即停止搜索其它location,开始执行location中的配置。
  2. 使用^~修饰符。注意,这个修饰符是普通前缀字符串匹配,不是正则修饰符。如果请求匹配到的最长前缀字符串location使用这个修饰符,将不再检查正则表达式location。
  3. 使用~或~*修饰符。这2个修饰符都是正则修饰符,后面uri可以使用正则表达式。~*表示不区分uri中的大小写,而~表示区分大小写。多个正则Location,在配置文件中的顺序代表了优先级,越靠前的优先级越高,一旦匹配到一个正则location,将不再搜索其它正则location,并使用匹配的location。
  4. 不使用修饰符。做普通前缀字符串匹配。如果请求可以匹配到多个普通前缀字符串location,将高优使用前缀匹配最长的location。

匹配流程说明

这里,我再做一个总结,帮助你更好的理解匹配流程。

一个请求进入server配置块之后,如果能匹配到一个=修饰的location,则直接使用这个location的配置。

如果无法匹配到=修饰的location,再看是否能匹配到一个最长前缀字符串location,且这个location使用了^~修饰符,如果能匹配,则直接使用这个location的配置。

如果无法匹配到使用了^~修饰符的最长前缀字符串location,那么再看能否匹配到一个正则表达式location,一旦匹配到就会使用这个location。

如果3种修饰符的location都没有匹配到,再搜索不使用修饰符的普通前缀字符串location,并使用前缀匹配最长的location。

如果所有的location都不能匹配,Nginx将向客户端返回404响应。

匹配流程图

下面再画一张流程图,帮助大家更好的理解匹配流程。

欢迎关注我的头条号@程序员地瓜, 及时获取最新发布动态。阅读文章过程中有任何问题,欢迎在评论区留言,我会及时回复。

扫描二维码推送至手机访问。

版权声明:本文由AR编程网发布,如需转载请注明出处。

本文链接:http://www.arlanguage.com/post/1127.html

标签: nginx php 404
分享给朋友:

“Nginx的Location到底是怎么匹配的?” 的相关文章

nginx开启ssl并把http重定向到https的两种方式

1 简介Nginx是一个非常强大和流行的高性能Web服务器。本文讲解Nginx如何整合https并将http重定向到https。https相关文章如下:(1)Springboot整合https原来这么简单(2)HTTPS之密钥知识与密钥工具Keytool和Keystore-Explorer(3)Sp...

windows 搭建php运行环境(2024年)

由于需要运行一套cms系统,需要运行php环境,现在开始记录搭建步骤:1、分别下载nginx和php包,然后解压到自己喜欢目录下面2、这里我们使用nginx的反向代理模式的FastCGI server,修改nginx.conf,然后启动或重启nginx。location ~ \.php$ {...

nginx出现大量499响应码怎么办?

一、问题现象监控发现Nginx服务日志中出现较多的499状态码,499状态码在Nginx中代表的是客户端在服务端返回之前主动断开了连接,由于客户端设置的超时时间为2s,故到达2s未收到服务端响应客户端主动断开了连接造成了499响应码。二、可能的故障点服务器的问题,例如CPU使用率高,队列堵塞,导致无...

Linux 网络延迟排查方法 linux延迟10秒

在 Linux 服务器中,可以通过内核调优、DPDK 以及 XDP 等多种方式提高服务器的抗攻击能力,降低 DDoS 对正常服务的影响。在应用程序中,可以使用各级缓存、WAF、CDN 等来缓解 DDoS 对应用程序的影响。但是需要注意的是,如果 DDoS 流量已经到达 Linux 服务器,那么即使应...

Linux日志处理神器-Logrotate

Logrotate简介Logrotate是Linux中日志分割、压缩、清理的工具,一般CentOS默认都会安装该工具。logrotate运行原理logrotate依赖于anacron执行每小时、每天、每周或每月的定时任务,corn每个小时会扫描当前机器中定时任务执行状态。 logrotate运行依...

linux系统安全,多人共用服务器,防止别人干‘坏事’

我们知道,在开发一个应用的过程中,需要涉及代码、操作系统、网络和数据库等多个方面。所以,只是了解代码安全肯定是不够的,我们还需要了解常见的基础环境和工具中的安全机制,学会通过正确地配置这些安全机制,来提升安全保障。谈到 Linux,我相信你每天都在使用 Linux 进行各种开发和运维操作。但是,大多...