Nginx 怎么让两个 location 共用同一套配置规则?
多个 location 复用同一规则的做法:把公共配置抽到 server 层(location 会继承)、用 include 引入共享片段文件、或一个 location 用正则匹配多个前缀。本文对比三种写法。
三种主流写法:①公共指令上提到 server 块——location 默认继承外层配置(能继承的指令);②公共规则抽到独立文件,各 location 里 include 引入;③用一个正则 location 同时匹配多个路径前缀。推荐顺序:能继承就继承,不能继承用 include。
写法一:上提到 server 层(利用继承)
server {
listen 80;
# 公共规则放这里,两个 location 自动继承
add_header Cache-Control "public, max-age=3600";
gzip on;
location /location1 {
root /var/www/app1;
}
location /location2 {
root /var/www/app2;
}
}
大多数指令(header、gzip、超时、日志)都能在 server 层声明、location 继承。注意:如果 location 内又写了同类指令(如 add_header),该层会整体覆盖外层同指令,而不是合并。
写法二:include 共享片段
# /etc/nginx/snippets/php-rules.conf
location ~ \.php$ {
fastcgi_pass unix:/run/php-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location /location1 {
root /var/www/app1;
include snippets/php-rules.conf;
}
location /location2 {
root /var/www/app2;
include snippets/php-rules.conf;
}
规则改一处,全部引用点生效。
写法三:一个 location 正则匹配多个前缀
location ~ ^/(location1|location2)/ {
alias /var/www/shared/;
expires 1h;
}
适合规则与后端完全一致、路径模式规整的场景。
选择建议
| 场景 | 推荐 |
|---|---|
| 规则对所有 location 适用 | 提到 server/http 层 |
| 规则只给部分 location | include 片段 |
| 多前缀同一应用 | 正则合并 |
观测云对照
共享配置的改动影响面要看全。 改公共片段会影响多个 location 的流量表现,观测云按 URI 前缀分组的错误率/延迟视图,让"这次改动波及了哪些路径"一目了然。
常见问题(FAQ)
Q:server 层的 proxy_pass 会被 location 继承吗?
A:不会。proxy_pass、root、alias 这类指令只在明确写的层级生效;公共"规则"限通用指令。
Q:include 文件里能写 root 吗?
A:能,但那样就失去各 location 自定义 root 的能力;片段里只放真正公共的部分。
Q:add_header 在外层和内层都写了为什么外层失效?
A:Nginx 的 add_header 同层整体替换语义:某层一旦写了,外层同指令全部不继承——公共 header 要么全在 server 层写,要么每层写全。