Nginx

Nginx 伺服器塊:https、非 www 和非 ssl 子域

  • January 9, 2016

這是我的場景:

兩個站點:

  1. https://example.com
  2. http://dev.example.com

站點 1 具有 ssl 證書。

站點 2 沒有。

(換句話說,我沒有萬用字元 ssl 證書。)

通過 Nginx,我正在嘗試建立必要的www重定向HTTP

站點 1 的目標是指導

example.com,www.example.comhttps://www.example.com

…到

https://example.com

站點 2 的目標是簡單地http://dev.example.com直接指向它自己。

我為目標 1 所做的努力

# SSL Redirect
server {
 listen 80;
 server_name example.com;
 return 301 https://filethemes.com$request.com;
}

# WWW Redirect
server {
 listen 80;
 listen 443 ssl;
 server_name www.example.com
 ssl_certificate <my-path-here>.crt;
 ssl_certificate_key <my-path-here>.key;
 return 301 https://example.com$request_uri
}

# Site's Primary Server Block
server {
 listen 443 ssl;
 root /var/www/example.com;
 index index.html;
 server_name example.com;
 ssl_certificate <my-path-here>.crt;
 ssl_certificate_key <my-path-here>.key;  
}

使用上面的程式碼,example.com轉到“ https://example.com ”,僅此而已。www 重定向不起作用。關於為什麼的任何想法?

此外,使用站點 2(子域)的簡單伺服器塊,dev.example.com它重定向到https://example.com. 所以看來我無意中將我的子域重定向到主域。想法?

我知道那裡已經有很多 Nginx 問題和答案,但我找不到任何解決方案可以幫助我按預期工作。

對於這樣一個看似簡單的目標,令人驚訝的是這證明了多麼具有挑戰性。

我很感激人們能提供的任何見解。

PS:是的,我的ssl證書支持www和非www。

更新:

子域問題(上面的站點 2)不再是問題……我未能將適當的文件從可用站點重新連結到已啟用站點。

站點 1 仍然存在相同的問題,沒有從www- 裸、withhttp和 with重定向https

解決了(!)

問題?沒有 DNS CNAME 條目(面對手掌!)。非常感謝@BE77Y 幫助我找到問題。另外,如果它對其他人有幫助,這是我目前且完全正常工作的 nginx 配置,由兩個伺服器塊組成,其中一個負責所有重定向到非 www 和 https (並使用 NGINX 最佳實踐,無需重新寫入並且沒有 if 語句):

# MAIN SERVER BLOCK
server {
 listen 443 ssl;
 root /var/www/example.com;
 index index.html;
 server_name example.com;
 ssl_certificate <my-path-here>.crt;
 ssl_certificate_key <my-path-here>.key;  
}

# REDIRECTS (send everything to non-www https)
server {
 listen 80;
 listen 443;
 server_name www.example.com example.com;
 ssl_certificate <my-path-here>.crt;
 ssl_certificate_key <my-path-here>.key;
 return 301 https://example.com$request_uri;
}

陷阱(適用於通常不使用伺服器的其他人):

  • 在測試之間清除記憶體(或打開和關閉隱身視窗)
  • 確保您有一個 CNAME DNS 條目(www example.com.)!

從我所見,你就快到了;我只是稍微不同地配置一些東西(根據您描述的要求),只是為了簡化一些事情。我要澄清的一件事是您似乎沒有在配置中包含 dev.example.com 段?

無論如何,以下是我將如何改進您目前的配置:

# Primary block including SSL redirect
server {
 listen 80;
 listen 443 ssl;
 server_name example.com;

 root /var/www/example.com;
 index index.html;

 ssl_certificate <my-path-here>.crt;
 ssl_certificate_key <my-path-here>.key;

 if ( $scheme = http ){
           rewrite ^ https://$server_name$request_uri? permanent;
           }
}

# WWW Redirect
server {
 listen 80;
 listen 443 ssl;
 server_name www.example.com
 ssl_certificate <my-path-here>.crt;
 ssl_certificate_key <my-path-here>.key;
 rewrite ^ https://example.com$request_uri? permanent;
}

澄清上述內容:這是一種“更清潔”的做事方式;如果有人在 上請求您的網站http://example.com,他們將https://example.com通過該if語句被重定向到,同樣,如果他們通過 https 請求它,他們將被正確地提供給該網站(這將是您之前使用的單獨語句的問題)。如果他們嘗試通過http://www.example.com它訪問該站點,它將被重定向,或者通過https://www.example.com它將正確協商 SSL,但仍按上述方式重定向。

正如我所指出的,你沒有在你的配置文件中包含任何與 dev.example.com 相關的部分——我認為這是因為你已經有了這些工作,但如果沒有,請隨時對此發表評論,我會很樂意協助他們將上述內容包括在內。

希望有幫助!

引用自:https://serverfault.com/questions/648917