Nginx
使用 nginx 將基本 url 重寫為 https
我只想將我的基本域 www.domain.com 重寫為https://www.domain.com 預設情況下,在我的 https 塊中,如果不是 ~uri = “/",我將它重新路由到 http:// (基本域)或靜態內容。
server { listen 443; set $ssltoggle 2; if ($uri ~ ^/(img|js|css|static)/) { set $ssltoggle 1; } if ($uri = '/') { set $ssltoggle 1; } if ($ssltoggle != 1) { rewrite ^(.*)$ http://$server_name$1 permanent; } }
因此,在我的 http 塊中,如果必須使用 https,我需要進行重寫:
server { listen 80; if ($uri = '/') { set $ssltoggle 1; } if ($ssltoggle = 1) { rewrite ^(.*)$ https://$server_name$1 permanent; } }
如果我在 http 塊中沒有 $uri = ‘/’ if 語句,那麼如果我直接轉到它,https 工作正常,但如果我轉到預期的正常 http,我不會被重定向。如果我確實將該語句放入 http 塊中,那麼一切都會在幾分鐘內停止工作。它可能適用於一些請求,但總是會在一分鐘左右內停止。在瀏覽器中,我只是為所有請求獲得一個空白頁面。如果我重新啟動 nginx,它會繼續不起作用,直到我刪除 https 和 http 塊中的兩個 if 語句塊並重新啟動 nginx。當我查看錯誤日誌時,我沒有看到任何記錄。當我查看訪問日誌時,我看到以下消息:
"-" 400 0 "-" "-"
我認為這意味著 400 錯誤。我不明白為什麼這對我不起作用。我的最終目標是讓基本域為 https-only,而所有其他頁面預設為 http。我怎樣才能做到這一點?
我最終改變了 $ uri to $ request_uri 因此可以在沒有重定向循環的情況下處理 args。
server { listen 443; set $ssltoggle 2; if ($uri ~ ^/(img|js|css|static)/) { set $ssltoggle 1; } if ($request_uri = '/') { set $ssltoggle 1; } if ($ssltoggle != 1) { rewrite ^(.*)$ http://$server_name$1 permanent; } }
然後,如果位置為 = /,我更改了 http 塊以立即重寫
server { listen 80; location = / { rewrite ^(.*)$ https://$server_name$1 permanent; } if ($ssltoggle = 1) { rewrite ^(.*)$ https://$server_name$1 permanent; } }
我仍然有 IF 語句來處理其他重寫,然後所有特定的服務都在這些之下完成。當我嘗試按照 Christopher 的建議或我最初在問題中提出的方式處理所有內容時,可能只是我的特定配置導致重定向循環和錯誤。