Nginx

使用 nginx 將基本 url 重寫為 https

  • September 30, 2012

我只想將我的基本域 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 的建議或我最初在問題中提出的方式處理所有內容時,可能只是我的特定配置導致重定向循環和錯誤。

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