使用 NGINX 设置一个 catchall

使用 NGINX 设置一个 catchall

我的 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 服务器

相关内容