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),以 add_header 默认规则为例,该层不再继承父层的 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;
}

这里 root 会保留 URI 前缀,例如 /location1/a.php 映射到 /var/www/app1/location1/a.php;PHP-FPM socket 和 fastcgi_params 需按安装配置,生产应限制可执行脚本路径。规则改一处,全部引用点生效。修改后分别请求两个路径,比较响应头、状态码与访问日志,避免只验证一个入口。

写法三:一个 location 正则匹配多个前缀

location ~ ^/(?:location1|location2)/(.+)$ {
    alias /var/www/shared/$1;
    expires 1h;
}

适合规则与后端完全一致、路径模式规整的场景。

选择建议

场景 推荐
规则对所有 location 适用 提到 server/http 层
规则只给部分 location include 片段
多前缀同一应用 正则合并

常见问题(FAQ)

Q:server 层的 proxy_pass 会被 location 继承吗?
A:proxy_pass 不可直接放在 server 上下文;root 可以在 http/server/location 设置并由未覆盖的子层继承,alias 则限 location。

Q:include 文件里能写 root 吗?
A:能,但那样就失去各 location 自定义 root 的能力;片段里只放真正公共的部分。

Q:add_header 在外层和内层都写了为什么外层失效?
A:默认继承规则下,某层一旦写了 add_header,便不再继承外层 add_header——公共 header 要么全在 server 层写,要么每层写全。Nginx 1.29.3 起可用 add_header_inherit merge 调整这一行为。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台