nginx 多个 http/https 代理域

nginx 多个 http/https 代理域

我有一台服务器,将托管许多网站,但现在只有两个。site1 (http://site1.com) 是 http 并且 site2 (https://site2.com) 是 https。这两个站点都是基于 node.js 并运行不同的端口,我使用 nginx 的 proxy_pass 将域路由到端口。

我现在遇到的问题是你可以导航到https://site1.com但它会加载 site2 的网站https://site1.com。显然这并不好,因为 google 已经在错误的域名下对 https 页面进行了索引。

我还不太熟悉 nginx,但我当前的配置肯定是将所有 https 流量路由到此端口。将来我会有多个 https 和 http 站点,显然所有流量都需要正确路由。

有人能看看我的配置并告诉我我做错了什么吗?

我的 nginx.conf 文件是默认的

这是我的http://site1.com配置

server
{
    listen 80;
    listen [::]:80;
    server_name site1.com www.site1.com;

    location /
    {
        proxy_pass http://127.0.0.1:3103;
        include /etc/nginx/proxy_params;
    }
}

这是我的https://site2.com配置

server {
  listen 80;
  listen [::]:80;
  server_name site2.com www.site2.com;
  return 301 https://$host$request_uri;
}

server {
        listen 443 ssl;
        server_name site2.com;

        ssl_certificate       /etc/nginx/ssl/site2_com.crt;
        ssl_certificate_key   /etc/nginx/ssl/site2_com.key;

        location / {
                proxy_set_header        Host $host;
                proxy_set_header        X-Real-IP $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header        X-Forwarded-Proto $scheme;

                proxy_pass              "http://127.0.0.1:3101";

                # rewrite redirects to http as to https
                proxy_redirect http:// https://;
        }
}

欢迎提出任何建议和问题!如果您需要更多信息,请告诉我。谢谢!

答案1

Nginx 始终有一个默认服务器,用于处理server_name不匹配的请求。如果您未使用属性明确指定一个服务器default_server,它将选择具有匹配指令的第一个服务器listen

在您的情况下,serversite2 的块用于处理任何https连接,尽管带有无效证书警告。

您可以定义一个“捕获全部”server块,以便server_name必须与每个合法server块匹配。

例如:

server {
    listen 80 default_server;
    listen 443 ssl default_server;
    return 444;
}

它可以很好地进行http连接。但是,https连接总是有问题的,因为您不能指望每个指向您服务器的虚假域名都有有效的证书。这至少可以防止错误的服务器块处理请求。

这个文件了解详情。

相关内容