2015-10-20 111 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"; 
    } 
}