如何使包含大量重复的“rewrite”指令的 nginx 配置文件变得 DRY

如何使包含大量重复的“rewrite”指令的 nginx 配置文件变得 DRY

我有一个/etc/nginx/nginx.conf具有以下基本结构:

http {
  server {
    listen 80;
    server_name example.com;
    root /var/html;
    location / {
      rewrite ...;
    }
  }
  server {
    listen 443;
    server_name example.com;
    root /var/html;
    location / {
      rewrite ...;
    }
  }
}

有许多rewrite指令,http 和 httpsserver块之间都是相同的,所以我尝试将它们提取到外部文件中:

http {
  server {
    listen 80;
    include /etc/nginx/redirects.conf;
  }
  server {
    listen 443;
    include /etc/nginx/redirects.conf;
  }
}

redirects.conf文件仅包含:

server_name example.com;
root /var/html; 
location / {
  rewrite ...;
}

nginx -t -c /etc/nginx.conf告诉我语法没有问题,但重写规则没有生效。我知道文件正在被评估,因为如果我引入语法错误,nginxs 就会出错。但除非我将它们保存在主文件中,否则重写会被忽略nginx.conf

我可能会使用的解决方法:利用“地图”模块(示例答案显示了如何做到这一点这里)。我可以使用的另一件事是使用 Ansible 模板化配置文件,至少使重复由机器生成,但我仍然想知道为什么会发生这种情况,以便更好地理解该include指令的局限性。

答案1

如果您的服务器块相同(除了 SSL 设置),那么您可以将它们合并。

单个 HTTP/HTTPS 服务器

可以配置一个处理 HTTP 和 HTTPS 请求的服务器:

server {
    listen              80;
    listen              443 ssl;
    server_name         www.example.com;
    ssl_certificate     www.example.com.crt;
    ssl_certificate_key www.example.com.key;
    ...
}

相关内容