我有一个/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 请求的服务器:
server { listen 80; listen 443 ssl; server_name www.example.com; ssl_certificate www.example.com.crt; ssl_certificate_key www.example.com.key; ... }