我正在尝试为我们拥有的各种不同的域和子域编写一个“捕获所有端口 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 -v
:nginx 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.org
和w*.example.org
是无效的。但是,可以使用正则表达式指定这些名称,例如~^www\..+\.example\.org$
和~^w.*\.example\.org$
。星号可以匹配多个名称部分。名称*.example.org
不仅匹配www.example.org
而且www.sub.example.org
也匹配。表单中的特殊通配符名称
.example.org
可用于匹配精确名称example.org
和通配符名称*.example.org
。
根据文档,您将需要使用基于正则表达式的检测匹配来进行此类域/子域匹配。