2016-07-15 140 views
1

我有問題將我的非www網址重定向到www和https。nginx重定向非www www和https domain.com和子域

我想要什麼:

http://domain.com 
http://www.domain.com 
https://domain.com 

應該重定向到https://www.domain.com

http://api.domain.com 

應該重定向到https://api.domain.com

我爲domain.com和api.domain.com seperata SSL密鑰。 api.domain.com的SSL設置通過node.js應用程序處理。此外domain.com使用根文檔和api.domain.com使用proxy_pass到的Node.js應用在端口1336,

我試了一下:

# route non ssl api to ssl 
server { 
    listen 80; 
    server_name api.domain.com; 
    return 301 https://api.domain.com; 
} 

# main ssl route for api.domain.com 
server { 
    listen 443 ssl; 

    server_name api.domain.com; 

    location/{ 
     proxy_pass https://localhost:1337; 
     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection 'upgrade'; 
     proxy_set_header Host $host; 
     proxy_cache_bypass $http_upgrade; 
    } 
} 

# route non ssl to www ssl 
server { 
    listen  80; 
    server_name www.domain.com domain.com; 
    return  301 https://www.domain.com; 
} 

# route non www ssl to ssl 
server { 
    listen  443 ssl; 
    server_name domain.com; 
    return  301 https://www.domain.com; 
} 

# main ssl route for domain.com 
server { 
    listen 443 ssl; 

    ssl on; 
    ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem; 
    ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem; 

    server_name www.domain.com; 

    location/{ 
     root /var/www/domain.com/www; 
    } 
} 

路由被按預期工作: https://www.domain.com http://domain.com http://www.domain.com

不工作:

https://domain.com - >不安全連接離子,因爲它試圖利用從api.domain.com的證書(這可以被緩存,因爲也許我之前的另一種方式,這是錯誤的嘗試吧)

https://api.domain.com->重定向到https://domain.com

http://api.domain.com - >重定向到https://domain.com

nginx的版本:nginx的/ 1.4.6(Ubuntu的)

回答

3

我能得到它的工作訣竅。一個問題是,nginx路線爲

listen 443; 
server_name www.domain.com; 

也觸發了https://domain.com。在Chrome開發人員控制檯中禁用緩存以進行測試也是非常有幫助的。

全部配置:

# main ssl route for www.domain.com 
server { 
    listen 443; 
    server_name www.domain.com; 

    ssl on; 
    ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem; 
    ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem; 

    root /var/www/domain.com/www; 
} 

# non-www ssl route 
server { 
    listen 443; 
    server_name domain.com; 

    return 301 https://www.domain.com$request_uri; 
} 

# route non ssl to www ssl 
server { 
    listen  80; 
    server_name www.domain.com domain.com; 
    return  301 https://www.domain.com$request_uri; 
} 

# route non ssl api to ssl 
server { 
    listen 80; 
    server_name api.domain.com; 
    return 301 https://api.domain.com$request_uri; 
} 

# main ssl route for api.domain.com 
server { 
    listen 443 ssl; 

    ssl on; 
    ssl_certificate /etc/letsencrypt/live/api.domain.com/fullchain.pem; 
    ssl_certificate_key /etc/letsencrypt/live/api.domain.com/privkey.pem; 

    server_name api.domain.com; 

    location/{ 
     proxy_pass http://localhost:1337; 
     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection 'upgrade'; 
     proxy_set_header Host $host; 
     proxy_cache_bypass $http_upgrade; 
    } 
}