使用 Nginx 實現 301 跳轉至 https 的根域名

基於 SEO 和安全性的考量,須要進行 301 跳轉,如下使用 Nginx 做通用處理html

實現結果

須要將如下地址都統一跳轉到 https 的根域名 https://chanvinxiao.comnginx

301 與 302 的區別

301 是永久重定向,302 是臨時跳轉,主要的區別在於搜索引擎對此的對待方式安全

  • 301:搜索引擎會將權重和 PR 值進行轉移
  • 302:搜索引擎不會進行額外處理

如今是但願搜索引擎認爲原地址已經不存在了,徹底轉移到新地址,因此使用 301bash

http 跳轉到 https

最簡單的方法是直接在 sever 中返回一個重定向的地址,中間再加上 301 狀態碼(不然默認爲 302)ui

server {
  listen 80;
  return 301 https://$host$request_uri;
}
複製代碼
  • returnrewrite 都屬於 Nginx 的重寫模塊的指令,由於這裏不須要對路徑進行修改,因此用 return 會比較方便
  • $host$request_uri 都是 Nginx http 模塊的嵌入變量,兩個變量合併一塊兒就至關於把請求的 http:// 去掉的結果

www 跳轉到根域名

這個只需在 https 中做處理,由於全部 http 都跳轉到 https 了搜索引擎

server {
  listen 443 ssl;
  server_name ~^(?<www>www\.)?(.+)$;
  if ( $www ) {
    return 301 https://$2$request_uri;
  }
...
複製代碼
  • 這裏利用了 server_name 的正則匹配功能,在其值前增長 ~ 便可啓用,支持 PCRE 語法
  • 使用正則是爲了確認是否有前綴 www. 以及捕獲根域名,生成兩個變量,一個是具名捕獲變量 $www ,另外一個是數值捕獲變量 $2
  • if 裏面不支持使用數值捕獲變量,不然會報錯( unknown "1" variable),因此增長了 ?<www> 將 $1 的值賦給了 $www

減小跳轉次數

以上設置已經知足了實現結果,可是有一點瑕疵,就是 http://www.chanvinxiao.com 會先跳轉到 https://www.chanvinxiao.com, 再跳轉到 https://chanvinxiao.com ,進行二次跳轉確定是不如只需跳轉一次的,因此最好讓其直接一步到位,修改 http 的配置以下:spa

server {
  listen 80;
  server_name ~^(?:www\.)?(.+)$;
  return 301 https://$1$request_uri;
}
複製代碼
  • 在 http 對應的 sever 中,把 server_name 也改成正則模式,並將 $host 用捕獲的根域名 $1 取代
  • www 在這裏會直接棄掉,因此不須要捕獲,使用 ?: 標示實現只分組不捕獲,因而後面的根域名就成了 $1
  • 這樣的結果是無論原來是否帶 www,都統一跳轉到不帶 www 的 https 根域名

總結

以上配置中不需指定特定域名,可方便兼容和移植,使用了 Nginx 的如下特性:code

  • server_name 的正則匹配
  • return 指令接收狀態碼和地址
  • $host 和 $request_uri 嵌入變量
相關文章
相關標籤/搜索