我在一台服务器上托管多个域名,服务器上有 nginx 服务器块。出于某种原因,当使用 https 请求其他域名时,它总是加载一个特定的网站。
- domain1.com /var/www/domain1.com
- 域名2.com /var/www/域名2.com ...
当我输入http://domain1.com 加载正确,但当我输入https://domain1.com 它提供 /var/domain2.com 下的内容
以下是我的 domain2 服务器块的 nginx 配置,该服务器块具有 SSL。我猜想listen 443 ssl default_server;
第三个服务器块是罪魁祸首,但不确定如何继续。我尝试从那里删除 default_server,但这会破坏网站。
如何配置 nginx 配置,以便其他域在使用 https 请求时不会提供错误的网站。我很感激任何帮助。
# Default server configuration
#
server {
listen 80;
listen [::]:80;
server_name domain2.com www.domain2.com;
return 301 https://www.domain2.com$request_uri;
}
server {
listen 443;
listen [::]:443;
server_name domain2.com;
return 301 https://www.domain2.com$request_uri;
}
server {
# SSL configuration
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
server_name www.domain2.com;
include snippets/ssl-domain2.com.conf;
include snippets/ssl-params.conf;
# Self signed certs generated by the ssl-cert package
# Don't use them in a production server!
#
# include snippets/snakeoil.conf;
root /var/www/domain2.com;
# Add index.php to the list if you are using PHP
index index.php index.html index.htm index.nginx-debian.html;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ /index.php?$args;
}
...
答案1
好吧,您观察到的是正常且预期的行为。您有多个域指向一个 IP 地址,并且目标计算机运行的 Web 服务器上只配置了一个 HTTPS 主机。无论您是否有服务器default_server
子句,您总是会有一个默认给定端口的虚拟主机。考虑到默认vhost 将始终终止所有没有适当 的请求server_name
,并且鉴于您只有一个server
端口 443,并且它是默认端口,它将终止对此 Web 服务器的所有 HTTP 请求。事实上,这种行为并不是 nginx 特有的,您会在 apache 上得到相同的行为,我想其他所有 Web 服务器实现也是如此。
准确定义你的意思其他域名没有提供错误的网站并相应地配置您的 Web 服务器。我建议您为所有其他域配置 HTTPS 或只是接受此行为,因为您无法在不破坏正在运行的 HTTPS 站点的情况下在数据包过滤器上过滤 HTTP 会话。最后一个选项是为您不想访问的所有域创建虚拟 HTTPS 站点并在那里提供 403 状态,但这是错误的。