nginx将多个域的所有https请求重定向到一个域

nginx将多个域的所有https请求重定向到一个域

我在一台服务器上托管多个域名,服务器上有 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 状态,但这是错误的。

相关内容