Nginx 正则 location 指令匹配客户端请求的 URI

张开发
2026/6/9 6:35:47 15 分钟阅读
Nginx 正则 location 指令匹配客户端请求的 URI
Nginx 正则表达式详解在 Nginx 中正则表达式主要用于location指令来匹配客户端请求的 URI从而实现精细化的请求路由和处理。location指令是 Nginx 路由的核心它决定了如何处理一个请求。不同的匹配模式有不同的优先级。Nginx 的location匹配规则其实有一套严格的“优先级算法”。简单来说Nginx 会优先检查“路径前缀匹配”如果前缀匹配带有^~标记则直接忽略正则否则Nginx 会继续检查正则表达式。为了让你彻底明白我将匹配规则拆解为“三个阶段”并总结了一个判断逻辑表。核心结论什么时候是正则什么时候是路径场景判定逻辑结果精确路径请求 URI 与location /path完全一致路径匹配(优先级最高立即结束)特殊前缀请求 URI 以location ^~ /path开头路径匹配(优先级高强制停止后续正则检查)普通前缀请求 URI 以location /path开头暂存。Nginx 会记下这个匹配但继续去检查正则。如果正则没匹配上才用这个。正则表达式请求 URI 符合location ~ pattern正则匹配(只有当“特殊前缀”未命中且正则按顺序第一个匹配时生效) 详细匹配流程按执行顺序当你发起一个请求例如/images/logo.png时Nginx 内部是这样一步步处理的第一步检查“精确匹配” ()规则location /images/logo.png行为如果 URI 和配置完全一模一样直接选中匹配结束。注意这是最高优先级不管后面有什么正则只要这里匹配了后面都不看。第二步检查“普通前缀” (/) 和 “特殊前缀” (^~)Nginx 会遍历所有非正则的location即不带~的寻找最长的那个匹配前缀。情况 A命中了^~配置location ^~ /images/行为一旦匹配成功Nginx立即停止搜索。正则表达式将被完全忽略。用途通常用于静态资源目录为了性能不让 Nginx 浪费时间去跑正则。情况 B命中了普通前缀 (无修饰符)配置location /images/行为Nginx 会把这个路径暂时记下来作为备选但不会停止它会继续进入第三步去检查正则。第三步检查“正则表达式” (~或~*)前提只有当第二步没有命中^~时才会执行这一步。行为Nginx 按照配置文件中从上到下的顺序逐个测试正则规则。结果一旦命中第一个正则规则立即停止搜索并使用该配置。兜底如果所有正则都没命中则使用第二步中记下来的那个“普通前缀”配置。 举例说明避坑指南假设你的配置如下# 1. 普通前缀匹配 location /static/ { # 配置 A } # 2. 正则匹配 (看起来能匹配 .jpg) location ~ \.jpg$ { # 配置 B } # 3. 特殊前缀匹配 location ^~ /static/images/ { # 配置 C }场景 1请求/static/test.jpg精确匹配无。前缀检查命中location /static/。记下它继续检查正则。正则检查命中location ~ \.jpg$。结果使用配置 B正则优先于普通路径。场景 2请求/static/images/logo.jpg精确匹配无。前缀检查命中location /static/。命中location ^~ /static/images/。因为^~优先级高且带有“停止”指令。结果使用配置 C^~强制拦截正则失效。location匹配规则与优先级匹配模式说明优先级location /path精确匹配URI 必须与指定路径完全相同。最高location ^~ /path前缀匹配匹配以指定路径开头的 URI匹配成功后不再进行正则匹配。高location ~ pattern正则匹配使用区分大小写的正则表达式进行匹配。中location ~* pattern正则匹配使用不区分大小写的正则表达式进行匹配。中location /path普通前缀匹配匹配以指定路径开头的 URI。低location /通用匹配匹配所有请求作为默认配置。最低优先级规则总结精确匹配 () 前缀匹配 (^~) 正则匹配 (~,~*按配置文件顺序) 普通前缀匹配 通用匹配 (/)。在 Nginx 的location配置中只要是以~或~*开头的就一定是正则表达式匹配。Nginx Location 修饰符速查表修饰符开头匹配模式说明~正则匹配区分大小写例如~ /A匹配/A但不匹配/a~*正则匹配不区分大小写例如~* /A既匹配/A也匹配/a路径匹配精确路径匹配必须完全一致^~路径匹配前缀路径匹配匹配到后停止正则搜索无修饰符路径匹配普通前缀路径匹配例如location /api 两个关键点区分大小写如果你写location ~ /Images/它只能匹配/Images/无法匹配/images/。如果你想忽略大小写必须加上*写成location ~* /Images/。优先级正则匹配~/~*的优先级低于和^~。正则匹配的优先级高于普通路径匹配无修饰符。总结看到~开头就是正则看到~*开头就是忽略大小写的正则。

更多文章