1. 程式人生 > >Nginx學習筆記——rewrite規則

Nginx學習筆記——rewrite規則

Nginx的rewrite規則

實現url重寫以及重定向。

場景

  1. URL訪問跳轉,支援開發設計
    頁面跳轉、相容性支援、展示效果等
  2. SEO優化
  3. 維護
    後臺維護、流量轉發等
  4. 安全,使用rewrite可以實現偽靜態

語法配置

Syntax:rewrite regex replacement [flag];
Default:預設無
Context:server,location,if

如:rewrite ^(.*)$ /pages/maintain.html breakl
解釋:將所有的頁面都改成維護頁面,flag:break;

正則表示式

符號 作用
. 匹配除換行符以外的任意字元
? 重複0次或1次
+ 重複1次或多次
* 重複0次或多次
\d 匹配數字
^ 匹配字串的開始
$ 匹配字串的結束
{n} 重複n次
{n,} 重複n次或更多次
[c] 匹配單個字元c
[a-z] 匹配a-z小寫字元的任意一個
\ 轉義字元
() 用於匹配括號之間的內容,通過$1、$2呼叫

flag

型別 作用
last 停止rewrite檢測
break 停止rewrite檢測
redirect 返回302臨時重定向,位址列會顯示跳轉後的地址
permanent 返回301永久重定向(快取,下次訪問,自動重定向),位址列會顯示跳轉後的地址

測試

last與break的區別

/etc/nginx/conf.d/下新建一個配置,如下:

server {
    listen 80;
    server_name localhost;

    access_log  /var/log/nginx/log/host.access.log  main;

    root /opt/app/code;

    location ~ ^/break {
        rewrite ^/break /test/ break;
    }

    location ~ ^/last {
         rewrite ^/last /test/ last;
    }

    location /test/ {
       default_type application/json;
       return 200 '{"status":"success"}';
    }
}

測試效果

訪問HOST/test/,正常訪問,沒問題。
訪問HOST/break/,返回404頁面找不到。
訪問HOST/last/,正常訪問,沒問題。

區別

    location ~ ^/break {
        rewrite ^/break /test/ break;
    }

break:匹配到location後,直接從root目錄下尋找改寫後的連結資源,找到則返回,找不到則返回404頁面未找到。

    location ~ ^/last {
         rewrite ^/last /test/ last;
    }

last:匹配到location後,改寫字串,內部相當於重新發起一次請求,然後進到別的location,執行正常流程。
區別:break直接找資源,last發起新的請求進入別的location。

redirect與last的區別

配置檔案稍作修改:

    location ~ ^/last {
         #rewrite ^/last /test/ last;
         rewrite ^/last /test/ redirect;
    }

訪問HOST/last/,正常訪問,發現url變成HOST/test/
回顧flag=last,正常訪問,但是url不變。
(1)當flag=redirect,使用curl -vL 192.168.174.132/last/進行測試,發現先請求的/last/,返回302,再請求的HOST/test/
(2)當flag=last,使用curl -vL 192.168.174.132/last/進行測試,返回200,直接可以獲取到內容。

redirect與permanent的區別

    location ~ ^/shen {
        #rewrite ^/shen http://192.168.174.132/test/ permanent;
        rewrite ^/shen http://192.168.174.132/test/ redirect;
    }

(1)當flag=redirect,訪問HOST/shen,跳轉訪問HOST/test/,url同時變化。F12開啟控制檯,檢視網路,如下:
在這裡插入圖片描述
一個302臨時重定向,一個200正常返回。
當關閉Nginx後,再次訪問HOST/shen,則無響應。

(2)當flag=permanent,訪問HOST/shen,跳轉訪問HOST/test/,url同時變化。F12開啟控制檯,檢視網路,如下:
在這裡插入圖片描述
一個301永久重定向,一個200正常訪問。
當關閉Nginx伺服器後,再次訪問HOST/shen,則訪問到HOST/test/,開啟F12,看到301的永久重定向是from disk cache
在這裡插入圖片描述
說明301永久重定向,是可以快取的。

rewrite重寫規則適用場景

過長的目錄結構,不便於搜尋引擎收錄

配置項:

location / {
        rewrite ^/course-(\d+)-(\d+)-(\d+)\.html$ /course/$1/$2/course_$3.html break;
    }

當目錄結構複雜的時候,巢狀過深,不便於搜尋引擎去收錄,則可以利用重寫規則去重寫。
此處flag=break,直接去對應目錄下找到資源,返回給客戶端($1等是呼叫前面的正則表示式的括號匹配內容)。

如:訪問http://192.168.174.132/course-11-22-33.html,則會去$root目錄下尋找/course/11/22/course_33.html,返回給客戶端。

對於不同瀏覽器,進行相容性跳轉

        if ($http_user_agent ~* Chrome) {
            rewrite ^/nginx http:/www.baidu.com redirect;
        }

若瀏覽器是Chrome,則重定向到指定資源或頁面。

若請求資源不存在,則重定向到指定頁面

        if (!-f $request_filename) {
            rewrite ^/(.*)$ http://www.baidu.com/s?wd=$1+$request_filename redirect;
        }

if語句的意思是,若$root+request_uri這個資原始檔不存在,則重定向。

rewrite規則優先順序

Server>location>指定location