Skip to content

location 匹配

location 用于定义 URI 路径的处理规则。匹配对象是规范化后的 $uri,不包含查询参数。

例如:

bash
/api/users?page=1

参与 location 匹配的是:

bash
/api/users

查询参数保存在 $args$query_string

写法

nginx
location [modifier] pattern {
    ...
}

常见 modifier:

写法类型说明
location = /path精确匹配完全匹配后立即使用
location /path前缀匹配普通前缀匹配
location ^~ /path优先前缀匹配命中后不再检查正则
location ~ pattern正则匹配区分大小写
location ~* pattern正则匹配不区分大小写
location @name命名 location只能内部跳转使用

匹配顺序

实际选择过程:

  1. 检查 = 精确匹配,命中后直接使用。
  2. 找到最长前缀匹配,记录下来。
  3. 如果最长前缀是 ^~,直接使用。
  4. 按配置顺序检查正则 ~~*
  5. 正则命中则使用第一个命中的正则。
  6. 正则未命中则使用第 2 步记录的最长前缀。

简化理解:

bash
= > ^~ > 正则按顺序 > 最长普通前缀

示例

nginx
location = /favicon.ico {
    access_log off;
}

location ^~ /assets/ {
    root /var/www/example.com;
    add_header Cache-Control "public, max-age=31536000, immutable";
}

location ~* \.(png|jpg|jpeg|gif|svg|webp)$ {
    expires 7d;
}

location /api/ {
    proxy_pass http://127.0.0.1:3000;
}

location / {
    try_files $uri $uri/ /index.html;
}

rootalias

root 会把完整 URI 拼到目录后面:

nginx
location /static/ {
    root /var/www/app;
}

请求 /static/a.js 实际文件:

bash
/var/www/app/static/a.js

alias 会用指定目录替换 location 前缀:

nginx
location /static/ {
    alias /var/www/app/assets/
}

请求 /static/a.js 实际文件:

bash
/var/www/app/assets/a.js

alias 目录通常需要以 / 结尾,避免路径拼接错误。

try_files

SPA 常用:

nginx
location / {
    try_files $uri $uri/ /index.html;
}

含义:

  1. 先找真实文件 $uri
  2. 再找目录 $uri/
  3. 都不存在时返回 /index.html,交给前端路由处理。

普通静态站点可返回 404:

nginx
location / {
    try_files $uri $uri/ =404;
}

基于 MIT 许可发布