Nginx proxy_pass重定向到错误的域

时间:2015-10-20 21:16:11

标签: redirect ssl nginx proxypass

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

前两个(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 doc上看过这个。这可能是问题的原因。

  

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

Link: see in Name-based HTTPS servers

1 个答案:

答案 0 :(得分:0)

最后,原因是我的证书仅适用于var c = document.getElementById("predefinedMessage"); var id= parseInt(c.selectedIndex) ; var text= "{{ form.predefinedMessage.vars.choices[id].data.message }}"; ,而不适用于example.com。所以它不匹配子域,我被重定向到第一个可用的SSL配置(这是example.com)。所以我在我的证书中添加了*.example.com以允许subjectAltName

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

html