Nginx

使用 nginx 刪除“www”並重定向到“https”

  • January 18, 2022

我想在 nginx 中創建一個規則來做兩件事:

  1. 刪除“www”。從請求 URI
  2. 如果請求 URI 是“http”,則重定向到“https”

有很多關於如何單獨完成這些事情的範例,但我無法找到一個同時正確完成的解決方案(即不創建重定向循環並正確處理所有情況)。

它需要處理所有這些情況:

1. http://www.example.com/path
2. https://www.example.com/path
3. http://example.com/path
4. https://example.com/path

這些都應該在https://example.com/path (#4) 結束而不循環。有任何想法嗎?

實現這一點的最好方法是使用三個伺服器塊:一個將 http 重定向到 https,一個將 https www-name 重定向到 no-www,一個實際處理請求。使用額外的伺服器塊而不是 ifs 的原因是伺服器選擇是使用雜湊表執行的,並且非常快。使用伺服器級別的 if 意味著對每個請求都執行 if,這是一種浪費。此外,在重寫中擷取請求的 uri 是一種浪費,因為 nginx 已經在 $ uri and $ request_uri 變數(分別不帶和帶查詢字元串)。

server {
   server_name www.example.com example.com;
   return 301 https://example.com$request_uri;
}

server {
   listen 443 ssl;
   ssl_certificate /path/to/server.cert;
   ssl_certificate_key /path/to/server.key;
   server_name www.example.com;
   return 301 https://example.com$request_uri;
}

server {
   listen 443 ssl;
   ssl_certificate /path/to/server.cert;
   ssl_certificate_key /path/to/server.key;
   server_name example.com;

   <locations for processing requests>
}

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