
Nginx 的 location
指令是其配置系统中最关键的组件之一,决定了服务器如何对请求 URI 进行匹配、转发与处理。理解其匹配规则与用法,是掌握 Nginx 配置能力的核心,尤其在构建高性能、高可维护性的 Web 服务中起着不可替代的作用。
一、什么是 location?
在 Nginx 的配置体系中,location
块定义了对特定 URI 请求的处理逻辑。每一个 location
都是服务器对某类请求路径的响应策略,可以决定:
- 如何定位静态资源路径
- 是否启用缓存
- 是否启用访问控制
- 是否进行 URI 重写或反向代理
其典型结构如下:
server {
listen 80;
server_name example.com;
location /images/ {
root /data/site/;
}
}
请求 http://example.com/images/logo.png
将映射到 /data/site/images/logo.png
二、location 匹配规则详解(含优先级)
Nginx 的 location
指令支持多种匹配方式。它会按照如下优先级依次查找匹配项,直到找到第一个“确定性匹配项”:
匹配方式 | 示例 | 说明 |
---|---|---|
= 精确匹配 | location = /login | 仅匹配完全等于 /login 的请求 |
^~ 前缀匹配 | location ^~ /img/ | 前缀匹配成功则停止继续正则匹配 |
~ 正则匹配 | location ~ \.php$ | 区分大小写的正则表达式匹配 |
~* 忽略大小写正则 | location ~* \.jpg$ | 匹配 .jpg 或 .JPG 结尾的请求 |
无修饰前缀匹配 | location / | 匹配所有 URI,最长前缀优先 |
⚠️ 如果
^~
和普通前缀同时满足,优先选择^~
所对应的 location,不再进入正则匹配阶段。
三、深入分析常用 location 场景配置
✅ 匹配静态资源(推荐使用 root)
location /static/ {
root /var/www/html/;
}
将请求 /static/js/main.js
映射到 /var/www/html/static/js/main.js
✅ 精确首页跳转(防止循环重定向)
location = / {
return 301 https://www.example.com/index.html;
}
✅ 配置反向代理 API 接口(完整保留 URI)
location /api/ {
proxy_pass http://127.0.0.1:3000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
🔍 注意:proxy_pass 后加
/
可防止 URI 被错误截断!
✅ 拦截特定路径,返回自定义状态码
location = /403 {
return 403 "Access Denied";
}
✅ 多后缀资源缓存控制
location ~* \.(css|js|jpg|png|webp|ico)$ {
expires 30d;
add_header Cache-Control "public";
access_log off;
}
四、深入理解 root vs alias 差异
很多初学者在使用 location
配置静态资源时,会混淆 root
与 alias
。
root
会把请求 URI 拼接 到 root 目录alias
会将匹配到的 URI 替换 为 alias 指定路径
示例对比:
location /img/ {
root /data/site;
# 实际路径:/data/site/img/file.png
}
location /img/ {
alias /data/images/;
# 实际路径:/data/images/file.png
}
建议:除非明确需要替换路径,大多数静态资源推荐使用
root
。
五、常见错误与调试建议
错误类型 | 错误描述 | 解决方式 |
匹配失败 | 写错了 /api vs /api/ | 保持一致性,加 / 更安全 |
返回 404 | 使用 alias 但未正确拼接 | 检查 alias 拼接路径 |
正则优先误判 | 以为正则优先于前缀 | 添加 ^~ 强制前缀优先 |
调试建议:使用 nginx -T
查看完整配置合并效果。
六、实战配置:动态接口 + 静态资源 + 管理后台权限控制
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/ssl/cert.pem;
ssl_certificate_key /etc/ssl/key.pem;
location / {
root /var/www/html;
index index.html;
}
location /admin/ {
allow 192.168.1.0/24;
deny all;
}
location /api/ {
proxy_pass http://127.0.0.1:5000/;
}
location ~* \.(js|css|png|jpg|woff2?)$ {
root /var/www/html;
expires 7d;
access_log off;
}
}
功能说明:
/
根路径展示首页/admin/
仅允许内网访问/api/
转发至后端接口- 静态资源设置缓存,减少负载