nginx的location段通过匹配优先级实现动静分离:先最长前缀、再按序正则、后精确(=)和前缀优先(^~)匹配,配合alias/root、缓存、代理等指令精准分发静态与动态请求。

Nginx 的 location 段是实现动静分离与精准资源定位的核心机制。它不依赖后端语言,仅靠请求路径、前缀、正则匹配和优先级规则,就能将静态资源(如图片、CSS、JS)直接由 Nginx 服务,而将动态请求(如 /api/ 或 .php)代理给后端应用服务器。
location 匹配逻辑决定资源走向
Nginx 按照“最长前缀匹配 → 正则匹配(按配置顺序)→ = 精确匹配 → ^~ 前缀优先”这一固定优先级处理 location。理解该顺序才能避免规则被意外跳过。
-
location = /favicon.ico:精确匹配,效率最高,适合小文件或高频固定路径 -
location ^~ /static/:前缀匹配且禁止后续正则检查,适合静态资源目录,确保稳定高效 -
location ~* \.(jpg|png|css|js)$:不区分大小写的正则匹配,适合扩展名分散的静态资源 -
location /api/:普通前缀匹配,常用于反向代理动态接口
动静分离典型配置示例
一个常见结构是把静态资源放在 /var/www/static/,后端服务监听 127.0.0.1:8000:
location ^~ /static/ {
alias /var/www/static/;
expires 1h;
add_header Cache-Control "public, immutable";
}
<p>location ~* .(ico|png|gif|jpg|jpeg|webp|css|js|woff2?|ttf|eot)$ {
root /var/www/assets;
expires 1y;
}</p><p>location /api/ {
proxy_pass <a href="https://www.php.cn/link/c099034308f2a231c24281de338726c1">https://www.php.cn/link/c099034308f2a231c24281de338726c1</a>;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}</p>
注意:alias 会替换整个匹配路径,root 是拼接路径;/static/ 后带斜杠时,alias 值末尾也需加斜杠,否则易 404。
避免常见陷阱
动静分离失效往往源于细节疏忽:
- 多个正则 location 顺序写反:Nginx 遇到第一个匹配的正则就停止,把宽泛规则(如
~ \.)放在前面会吞掉更具体的规则 - 忘记关闭正则继承:在
location ~ \.php$内未显式定义root或fastcgi_param SCRIPT_FILENAME,会导致脚本路径错误 - 使用
root代替alias处理带路径别名的静态资源,造成重复路径(如请求/static/js/app.js却查找/var/www/static/static/js/app.js) - 未限制静态资源方法:应添加
limit_except GET HEAD { deny all; }防止非安全方法访问
调试与验证技巧
启用 error_log /var/log/nginx/error.log notice; 可查看 location 匹配过程;用 curl -I 检查响应头中的 X-Accel-Redirect、Content-Type 和缓存头是否符合预期;配合 nginx -t 和 nginx -s reload 快速验证配置生效。










