網站首頁 編程語言 正文
一、rewrite語法
指令語法:rewrite regex replacement[flag]
默認值:none
應用位置:server、location、if
regex是PCRE 風格的,如果regex匹配URI,那么URI就會被替換成replacement,replacement 就是新的URI。如果rewrite同一個上下文中有多個這樣的正則,匹配會依照rewrite指令出現的順序先后依次進行下去,匹配到一個之后并不會終止,而是繼續往下匹配,直到返回最后一個匹配上的為止。如果想要中止繼續往下匹配,可以使用第三個參數flag。
如果新URI字符中有關于協議的任何東西,比如http://或者https://等,進一步的處理就終止了,直接返回客戶端302。
如果返回的是30x,那么瀏覽器根據這個狀態碼和Location響應頭再發起一次請求,然后才能得到想要的響應結果。但是,如果不是返回30x狀態碼,那么跳轉就是內部的,瀏覽器不做跳轉就能得到相應。
rewrite是實現URL重定向的重要指令,他根據regex(正則表達式)來匹配內容跳轉到replacement,結尾是flag標記
示例:
rewrite ^/(.*) http://www.baidu.com/ permanent; # 匹配成功后跳轉到百度,執行永久301跳轉
常用正則表達式:
字符 | 描述 |
---|---|
\ | 將后面接著的字符標記為一個特殊字符或者一個原義字符或一個向后引用 |
^ | 匹配輸入字符串的起始位置 |
$ | 匹配輸入字符串的結束位置 |
* | 匹配前面的字符零次或多次 |
+ | 匹配前面的字符一次或多次 |
? | 匹配前面的字符零次或一次 |
. | 匹配除“\n”之外的所有單個字符 |
(pattern) | 匹配括號內的pattern |
rewrite的最后一項參數
標記符號 | 說明 |
---|---|
last | 本條規則匹配完成后繼續向下匹配新的location URL 規則 |
break | 本條規則匹配完成后終止,不在匹配任何規則 |
redirect | 返回302臨時重定向 |
parmanent | 返回301永久重定向 |
二、應用場景
- 調整用戶瀏覽的URL,看起來規范
- 為了讓搜索引擎收錄網站內容,讓用戶體驗更好
- 網站更換新域名后
- 根據特殊的變量、目錄、客戶端進行跳轉
三、rewrite指定工作原理
rewrite模塊的指令有break, if, return, rewrite, set等。rewrite指令所執行的順序如下:
首先在server上下文中依照順序執行rewrite模塊指令;如果server中進行了rewrite重新,那么以新的URL發起內部跳轉,直接匹配location,不會再執行server中的rewrite指令,然后
- 新URL直接匹配location
- 如果匹配上某個location,那么其中的rewrite模塊指令同樣依照順序執行。
- 如果再次導致URL的rewrite,那么再一次進行內部跳轉去匹配location,但跳轉的總次數不能超過10次。
四、flag 參數簡介
1、last
如果有last參數,那么停止處理任何rewrite相關的指令,立即用替換后的新URI開始下一輪的location匹配。
如果在location的rewrite也使用last,便會再次以新的URI重新發起內部重定向,再次進行location匹配,而新的URI中極有可能和舊的URI一樣再次匹配到相同location中,這樣死循環發生了。當循環到第10次時,Nginx會終止這樣無意義的循環,并返回500錯誤。這點需要特別的注意。
2、break
停止處理任何rewrite的相關指令,就如同break 指令本身一樣。
last的break的相同點在于,立即停止執行所有當前上下文的rewrite模塊指令;不同點在于last參數接著用新的URI馬上搜尋新的location,而break不會搜尋新的location,直接用這個新的URI來處理請求,這樣能避免重復rewite。因此,在server上下文中使用last,而在location上下文中使用break。
3、redirect
replacement 如果不包含協議,仍然是一個新的的URI,那么就用新的URI匹配的location去處理請求,不會返回30x跳轉。但是redirect參數可以讓這種情況也返回30x(默認302)狀態碼,就像新的URI包含http://和https://等一樣。這樣的話,瀏覽器看到302,就會再發起一次請求,真正返回響應結果的就是這第二個請求。
4、parmanent
和redirect參數一樣,只不過直接返回301永久重定向
雖說URI有了新的,但是要拼接成完整的URL還需要當前請求的scheme,以及由server_name_in_redirect和port_in_redirect指令決定的HOST和PORT.
還有一個比較有意思的應用,就是如果replacement中包含請求參數,那么默認情況下舊URI中的請求參數也會拼接在replacement后面作為新的URI,如果不想這么做,可以在replacement的最后面加上?。
舉例說明:
rewrite ^/users/(.*)$ /show?user=$1? last;
這樣的新URI還是 /show?user=xxx
但如果不加問號:
rewrite ^/users/(.*)$ /show?user=$1 last;
得到的新URI就是/show?user=$1&xxx=xxx。其中xxx=xxx是舊URI所帶的請求參數。
五、示例
server {
# 訪問 /last.html 的時候,頁面內容重寫到 /index.html 中,并繼續后面的location匹配,瀏覽器地址欄URL地址不變
rewrite /last.html /index.html last;
# 訪問 /break.html 的時候,頁面內容重寫到 /index.html 中,并停止后續的匹配,瀏覽器地址欄URL地址不變;
rewrite /break.html /index.html break;
# 訪問 /redirect.html 的時候,頁面直接302定向到 /index.html中,瀏覽器地址URL跳為index.html
rewrite /redirect.html /index.html redirect;
# 訪問 /permanent.html 的時候,頁面直接301定向到 /index.html中,瀏覽器地址URL跳為index.html
rewrite /permanent.html /index.html permanent;
# 把 /html/*.html => /post/*.html ,301定向
rewrite ^/html/(.+?).html$ /post/$1.html permanent;
# 把 /search/key => /search.html?keyword=key
rewrite ^/search\/([^\/]+?)(\/|$) /search.html?keyword=$1 permanent;
# 把當前域名的請求,跳轉到新域名上,域名變化但路徑不變
rewrite ^/(.*) http://www.jd.com/$1 permanent;
}
總結
原文鏈接:https://blog.csdn.net/zz_15127160921/article/details/123110580
相關推薦
- 2022-03-31 用python實現彈球小游戲_python
- 2022-03-26 .NET?6中使用DateOnly和TimeOnly類型_ASP.NET
- 2022-09-25 ubuntu 20.04 開機黑屏小橫杠和循環登錄
- 2022-08-25 pycharm中keras導入報錯無法自動補全cannot?find?reference分析_pyt
- 2022-08-02 C#5.0中的異步編程關鍵字async和await_C#教程
- 2022-05-27 C++左值與右值,右值引用,移動語義與完美轉發詳解_C 語言
- 2022-05-28 C++實現簡單的學生成績管理系統_C 語言
- 2023-07-30 使用Elementui元素動態增減表單組件
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支