Nginx 伺服器塊:https、非 www 和非 ssl 子域
這是我的場景:
兩個站點:
https://example.com
http://dev.example.com
站點 1 具有 ssl 證書。
站點 2 沒有。
(換句話說,我沒有萬用字元 ssl 證書。)
通過 Nginx,我正在嘗試建立必要的
www
重定向HTTP
。站點 1 的目標是指導
example.com
,www.example.com
和https://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 相關的部分——我認為這是因為你已經有了這些工作,但如果沒有,請隨時對此發表評論,我會很樂意協助他們將上述內容包括在內。
希望有幫助!