2015-10-20 90 views
1

我在我的nginx配置中有三个不同的proxy_pass。其中两个重定向到https主机,最后一个通过标准端口80.Nginx proxy_pass重定向到错误的域

两个第一个(example.comproxmox.example.com)工作正常。

但问题是关于第三个。 http://blog.example.com重定向到https://example.com,我不明白为什么。

如果有人有一个想法...我是nginx的新手,我仍然难以理解带或不带SSL的proxy_pass。

这是我的配置。

server { 
    listen 80 default_server; 
    server_name _; 
    return 444; 
} 

server { 
    listen 80; 
    server_name example.com proxmox.example.com; 
    rewrite ^(.*) https://$host$1 permanent; 
} 

server { 
    listen 443; 
    server_name example.com; 
    ssl on; 
    ssl_certificate /etc/nginx/ssl/server.crt; 
    ssl_certificate_key /etc/nginx/ssl/server.key; 
    proxy_redirect off; 
    location/{ 
     proxy_pass https://localhost:8000; 

     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; 
    } 
} 
server { 
    listen 443; 
    server_name proxmox.example.com; 
    ssl on; 
    ssl_certificate /etc/nginx/ssl/server.crt; 
    ssl_certificate_key /etc/nginx/ssl/server.key; 
    proxy_redirect off; 
    location/{ 
     proxy_pass https://localhost:8006; 

     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_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection "upgrade"; 
    } 
} 

server { 
    listen 80; 
    server_name blog.example.com; 
    proxy_redirect off; 
    location/{ 
     proxy_pass http://10.0.0.3:80; 

     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; 
    } 
} 

感谢

编辑

我已经在Nginx的文档阅读。这可能是问题的原因。

使用此配置,浏览器将接收默认服务器的证书,即www.example.com,而不管所请求的服务器名称如何。这是由SSL协议行为造成的。 SSL连接在浏览器发送HTTP请求之前建立,而nginx不知道请求的服务器的名称。因此,它可能只提供默认服务器的证书。

Link: see in Name-based HTTPS servers

+0

只是一个猜测:是否正确设置了“blog.example.com”的DNS-A条目?可能它指向一个错误的目标IP .. – semm0

+0

也许这就是'10.0.0.3:80'所做的。 –

+0

事实上,我在装有proxmox的主机上。所以'localhost'是主要的主机,'10.0.0。*'是proxmox容器......所以10.0.0.3是我的proxmox容器之一。对于DNS,它应该没问题,因为我的容器正在使用主机DNS信息。 –

回答

0

最后,是因为我的证书是只为example.com而不是*.example.com。所以它不匹配子域,我被重定向到第一个可用的SSL配置(这是example.com)。因此,我已将subjectAltName添加到我的证书中,以允许*.example.com

然后,我还将我的证书声明的定义直接更改为Nginx配置的html部分用于缓存目的。这是我的最终配置:

# Certificates 
ssl_certificate /etc/nginx/ssl/server.crt; 
ssl_certificate_key /etc/nginx/ssl/server.key; 

# Return 404 if no server name matches 
server { 
    listen 80 default_server; 
    server_name _; 
    return 444; 
} 

# Redirect chosen domain to https 
server { 
    listen 80; 
    server_name example.com proxmox.example.com; 
    rewrite ^(.*) https://$host$1 permanent; 
} 

# Main configuration 
server { 
    listen 443; 
    server_name example.com; 
    ssl on; 
    proxy_redirect off; 
    location/{ 
     proxy_pass https://localhost:8000; 

     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; 
    } 
} 

# Proxmox configuration 
server { 
    listen 443; 
    server_name proxmox.example.com; 
    ssl on; 
    proxy_redirect off; 
    location/{ 
     proxy_pass https://localhost:8006; 

     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_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection "upgrade"; 
    } 
}