示例情况。 我有一个IPV4地址的networking服务器。 我主持了50个网站,其中只有两个有SSL证书。 我已经为2个SSL网站configuration了虚拟主机,除了一个大问题,一切都还好,如果我使用https://前缀访问其他48个站点(他们没有SSL证书),我看到我的最新网站有一个SSL证书。
在非SSL网站上可以阻止https前缀? 或者只有一个解决scheme – 使用专用的IP地址。 如果我有专用的IP地址,我正在使用以下configuration:
server { listen 111.222.333.444:443 ssl; }
这样,如果我强制https在非SSL网站 – 没有任何反应。
Nginx使用一个“默认服务器”,当没有另一个最接近的匹配时,它会select服务页面。 如果您还没有指定要使用的默认服务器,我相信它使用它find的第一个(在您的情况下是您的HTTPS站点之一)。 所以,你应该能够创build一个默认的服务器虚拟主机与你的IPv4地址的TLS(你只使用TLS而不是SSL了吗?),并监听IP,将捕获随机的HTTPS请求。 您可能还需要在那里为您的48个非安全站点添加server_name项目,但是如果没有这个项目,它也可能会工作。
#Your catch-all HTTPS server: server { listen 104.218.234.204:443 default_server; server_name ruel.in ruel.pro; root /var/www/ruel.pro; index index.html; ssl on; ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem; ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key; ssl_dhparam /etc/ssl/private/dhparams_4096.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; } #Regular HTTP server server { listen ruel.in:80; server_name ruel.in; root /var/www/ruel.in; index index.php index.html index.htm; ... } #Regular HTTP server server { listen ruel.pro:80; server_name ruel.pro; root /var/www/ruel.pro; index index.php index.html index.htm; ... } #Your HTTPS server server { listen dallas.ruhnet.net:443 ssl; server_name dallas.ruhnet.net; ... }
另一种方法是继续使用HTTPS设置它们! 使用Let's Encrypt项目( https://www.letsencrypt.org ),您可以免费获得所有其他站点的可信证书。 这很容易。
我很熟悉这个问题。
我们基本上要避免不惜一切代价,将我们的configuration文件中的第一个服务器定义作为SSL连接的全部服务器。 我们都知道它是这样做的(相反,http和使用default_serverconfiguration,很好地工作)。
这不能在Nginx的SSL(声明性)实现,所以我们必须编写一个IF …
variables$host是来自请求行或http头的主机名。 variables$server_name是我们现在所在的服务器块的名称。
所以,如果这两个不相等,那么你服务这个SSL服务器块为另一个主机,所以应该被阻止。
我们可以在每个服务器块中实现这个(当然包括一个通用的)。
该代码不包含对您的服务器IP地址或服务器名称的特定引用,因此可以轻松地将其重新用于其他服务器configuration,而无需进行修改。
例:
server { listen 443 ssl http2; listen [::]:443 ssl http2; ### ### Section: SSL # ## Check if this certificate is really served for this server_name ## http://serverfault.com/questions/578648/properly-setting-up-a-default-nginx-server-for-https if ($host != $server_name) { #return 404 "this is an invalid request"; return 444; } # ...