主题
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 | 只能内部跳转使用 |
匹配顺序
实际选择过程:
- 检查
=精确匹配,命中后直接使用。 - 找到最长前缀匹配,记录下来。
- 如果最长前缀是
^~,直接使用。 - 按配置顺序检查正则
~、~*。 - 正则命中则使用第一个命中的正则。
- 正则未命中则使用第 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;
}root 与 alias
root 会把完整 URI 拼到目录后面:
nginx
location /static/ {
root /var/www/app;
}请求 /static/a.js 实际文件:
bash
/var/www/app/static/a.jsalias 会用指定目录替换 location 前缀:
nginx
location /static/ {
alias /var/www/app/assets/
}请求 /static/a.js 实际文件:
bash
/var/www/app/assets/a.jsalias 目录通常需要以 / 结尾,避免路径拼接错误。
try_files
SPA 常用:
nginx
location / {
try_files $uri $uri/ /index.html;
}含义:
- 先找真实文件
$uri。 - 再找目录
$uri/。 - 都不存在时返回
/index.html,交给前端路由处理。
普通静态站点可返回 404:
nginx
location / {
try_files $uri $uri/ =404;
}