我的 nginx 服务器配置有问题。当前的行为是,如果在任何配置文件中都找不到某个域,它将重定向到随机的其他配置。相反,我希望只显示 404 错误或类似内容。
我研究过使用“default_server”,并查看了其他解决方案 - 但后来我注意到了这一点:
如果我在 /etc/nginx/sites-enabled/ 中使用“default_server”,并使用 进行测试nginx -t
,它会警告我有关重复的内容:nginx: [emerg] a duplicate default server for 0.0.0.0:80 in /etc/nginx/sites-enabled/catchall:5
。我使用 搜索了重复项grep -R default_server /etc/nginx
,发现只有一个文件包含default_server
:/etc/nginx/nginx.conf
。
现在,当我查看该文件时,我开始感到困惑:它显然已经完成了我想要做的事情,在这个块中:
...
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
server_name_in_redirect off;
log_not_found off;
return 410;
}
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
...
我的问题是:为什么这还不起作用?为什么任何配置文件中未列出的错误域不会默认为 410 错误?它nginx.conf
甚至做了什么?我在这里遗漏了什么?
如果不先问清楚这里最好的方法是什么,我会觉得改变很不舒服nginx.conf
。我只想实现 NGINX 在找不到特定域时不会随机跳转到其他域。
我如何制作 404 捕获器以及将它放在哪里?
答案1
感谢 Richard 和 Dom 的帮助,我设法找出了真正的问题:
catchallnginx.conf
有效 - 但仅适用于 HTTP。问题是,这里发生的事情是 SSL 没有实际意义default_server
。它只是从所有配置中选择最佳匹配(在我的情况下,是 CertBot 处理的第一个配置)。
我实施了这个解决方案来解决我的情况:
https://jonnev.se/nginx-default-server-with-https/
(基于这个问题:正确设置 https 的“默认” nginx 服务器)