飞跃高山与大洋的鱼飞跃高山与大洋的鱼
首页
先看
计算机
  • 数学
  • Linux
  • Arch
  • Manjaro
  • Ubuntu
  • CentOS
  • Kubernetes
  • Web
  • JavaScript
  • TypeScript
  • CSS
  • Canvas
  • Vue
  • Vite
  • NuxtJS
  • Webpack
  • Flutter
  • D3
  • Jest
  • WeApp
  • Utils
  • Nodejs
  • Nestjs
  • Golang
  • Nginx
  • Traefik
  • MySQL
  • MongoDB
  • Redis
  • Docker
算法
  • 像素风
  • Git
  • Github
  • VSCode
  • Chrome
  • Google
  • Bookmark scripts
  • 导航 🎉
  • VuePress 侧边栏插件
  • VuePress 官网
🚇 开往
首页
先看
计算机
  • 数学
  • Linux
  • Arch
  • Manjaro
  • Ubuntu
  • CentOS
  • Kubernetes
  • Web
  • JavaScript
  • TypeScript
  • CSS
  • Canvas
  • Vue
  • Vite
  • NuxtJS
  • Webpack
  • Flutter
  • D3
  • Jest
  • WeApp
  • Utils
  • Nodejs
  • Nestjs
  • Golang
  • Nginx
  • Traefik
  • MySQL
  • MongoDB
  • Redis
  • Docker
算法
  • 像素风
  • Git
  • Github
  • VSCode
  • Chrome
  • Google
  • Bookmark scripts
  • 导航 🎉
  • VuePress 侧边栏插件
  • VuePress 官网
🚇 开往
  • NGINX

    • 快速开启 Nginx
    • 为 Nginx 配置 systemd 服务
    • 处理 Nginx ERR
    • 使用 goaccess 可视化查看日志
    • Nginx 的限制模块
    • Nginx 的 location 规则
      • 规则
        • 1. =
        • 2. ~、~*
        • 3. ^~、none
      • 顺序
    • 主从 Nginx
    • Nginx 反向代理与负载均衡
    • Nginx 的 proxy_pass 规则
    • Nginx 防盗链
    • Nginx 的 rewrite 规则
    • root 与 alias 区别
    • Nginx 至 HTTPS
    • websocket 反向代理

Nginx 的 location 规则

规则

Syntax: location [ = | ~ | ~* | ^~ ] uri { ... }
    location @name { ... }
Default: —
Context: server, location

可以看到 location 具备两种规则,其中 @ 表示内部服务跳转,用于处理异常请求。

另外的是修饰符:

prefixprioritydesc
=1路径完全匹配
~3区分大小写的正则匹配
~*3不区分大小写的正则匹配
^~2前缀匹配
4不带任何修饰的前缀匹配,便于区分后续用 none 替代,Nginx 并无该说法

1. =

location = /abc {
  # localhost/abc # 匹配
  # localhost/ABC # 据说 windows 大小写不敏感会匹配,但未测试
  # localhost/abc/ # 不匹配
  # localhost/abcd # 不匹配
  # localhost/abc?a=1 # 匹配
}

location = /abc/ {
  # localhost/abc/ # 匹配
  # localhost/abc # 不匹配
  # localhost/abc/a # 不匹配
}

2. ~、~*

# 此处未对结尾做限制,`~*` 一致
location ~ ^/abc {
  # localhost/abc # 匹配
  # localhost/abcd # 匹配
  # localhost/abc/a # 匹配
  # localhost/abc/a/b # 匹配
}

3. ^~、none

# ^~ 一致,只是优先度更高
location /abc {
  # localhost/abc # 匹配
  # localhost/abcd # 匹配
  # localhost/abcd/a # 匹配
  # localhost/abc/a/b # 匹配
}

顺序

伪代码:

let temp
if (精准匹配 `=`)
  return 精准匹配的结果
else
  if (前缀匹配) // 前缀匹配包括 `^~` 和 啥都没有
    if (前缀匹配 `^~`)
      return 前缀匹配结果
    else if (前缀匹配 `none`)
      temp = 前缀匹配结果
  else if (正则匹配)
    return 正则匹配结果
return temp

需要注意的是前缀匹配模式下与 location 在文件中的顺序无关,比的是谁的 location 更长;而正则匹配则跟顺序有关。

编辑文档!
上次更新:
贡献者: shanyuhai123
Prev
Nginx 的限制模块
Next
主从 Nginx