相同的 nginx 默认文件在一台服务器上运行,但在另一台服务器上不运行?

相同的 nginx 默认文件在一台服务器上运行,但在另一台服务器上不运行?

我正在尝试为我们拥有的各种不同的域和子域编写一个“捕获所有端口 80 并强制 443”的代码。为此,我尝试使用通配符,如下所示:

server {
        listen 80;
        server_name *.ourdomain.com www.*.ourdomain.com *.anotherdomain.com www.*.anotherdomain.com
        return 301 https://$server_name$request_uri;
}

这是写在/etc/nginx/sites-availiable/default

我在三台服务器上使用完全相同的代码片段,所有服务器都运行相同版本的 NGINX。

输出为sudo nginx -vnginx version: nginx/1.11.5在两台服务器上

其中两个运行正常,另一个根本不让我启动 NGINX。我得到以下信息:

nginx: [emerg] invalid server name or wildcard "www.*.ourdomain.com" on 0.0.0.0:80

有没有什么线索表明,这台特定服务器的行为与其他服务器不同,或者我如何才能让它恢复正常?

如果您需要任何其他信息,请提出,我会编辑该问题。

答案1

有问题的通配符模式(www.*.ourdomain.com即模式)在 NGINX 中被视为无效的server_name指令值。为什么它一开始在一台服务器上有效是一个谜,我将之归结为“故障”。

引用NGINX 文档关于该server_name指令(该部分称为“服务器名称”),它与您提到的这种情况特别相关:

通配符名称

通配符名称只能在名称的开头或结尾处包含星号,并且只能在点边框处包含星号。名称www.*.example.orgw*.example.org是无效的。但是,可以使用正则表达式指定这些名称,例如~^www\..+\.example\.org$~^w.*\.example\.org$。星号可以匹配多个名称部分。名称*.example.org不仅匹配www.example.org而且 www.sub.example.org也匹配。

表单中的特殊通配符名称.example.org可用于匹配精确名称example.org和通配符名称 *.example.org

根据文档,您将需要使用基于正则表达式的检测匹配来进行此类域/子域匹配。

相关内容