Nginx 怎么让两个 location 共用同一套配置规则?

多个 location 复用同一规则的做法:把公共配置抽到 server 层(location 会继承)、用 include 引入共享片段文件、或一个 location 用正则匹配多个前缀。本文对比三种写法。

最佳实践
Nginx 怎么让两个 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 层写,要么每层写全。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台