Nginx學習筆記——rewrite規則
Nginx的rewrite規則
實現url重寫以及重定向。
場景
- URL訪問跳轉,支援開發設計
頁面跳轉、相容性支援、展示效果等 - SEO優化
- 維護
後臺維護、流量轉發等 - 安全,使用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