[Linux] nginx的location和rewrite

一、Nginx常用的正則表達式

符號作用
^匹配輸入字符串的起始位置
$?匹配輸入字符串的結束位置
*匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
+?匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”
?匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}”
.匹配除“\n”之外的任何單個字符,若要匹配包括“\n”在內的任意字符,請使用諸如“[.\n]”之類的模式
\將后面接著的字符標記為一個特殊字符或一個原義字符或一個向后引用。如“\n”匹配一個換行符,而“\$”則匹配“$”
\d匹配純數字[0-9] ? \s :空白符 ? ?\w :任意單詞字符包括下劃線[A-Za-z0-9_]
{n}重復 n 次
{n,}重復 n 次或更多次
{n,m}重復 n 到 m 次
[ ]定義匹配的字符范圍
[c]匹配單個字符 c
[a-z]匹配 a-z 小寫字母的任意一個
[a-zA-Z0-9]匹配所有大小寫字母或數字
()表達式的開始和結束位置
|或運算符

?1.1 location和rewrite的區別

從功能看 rewrite 和 location 似乎有點像,都能實現跳轉,主要區別在于 rewrite 是在同一域名內更改獲取資源的路徑,而 location 是對一類路徑做控制訪問或反向代理,還可以proxy_pass 到其他機器。

rewrite 對訪問的域名或者域名內的URL路徑地址重寫
location 對訪問的路徑做訪問控制或者代理轉發

二、location的匹配規則?

2.1 location的分類

精準匹配:location = / {...}
一般匹配:location / {...}?
正則匹配:location ~ / {...}

2.2 匹配規則

= :進行普通字符精確匹配,也就是完全匹配。
^~ :表示普通字符匹配。使用前綴匹配。如果匹配成功,則不再匹配其它 正則匹配location。
~ :區分大小寫的匹配。
~* :不區分大小寫的匹配。
!~ :區分大小寫的匹配取非。
!~* :不區分大小寫的匹配取非。
?

2.3 location 優先級?

首先精確匹配 =
其次前綴匹配 ^~
其次是按文件中順序的正則匹配 ~或~*
然后匹配不帶任何修飾符的一般前綴匹配
最后是交給 / 通用匹配

?2.4 location 示例

示例一:精準匹配?
location = / {
root /var/www/html}

"="為精確匹配 / ,主機名后面不能帶任何字符串,例如想訪問該location制定的匹配網頁時,只能訪問該主機IP或域名下的"/"(網頁也只能存放在/var/www/html/ 下),而像"/abc,/data,/test"這一類和location等于號后面路徑有任何一點差別的,都不會被匹配到。該匹配方式優先級最高,一旦匹配成功則立即采用?

示例二:通用匹配?
location / {
root /var/www/html
}

因為所有的地址都以 / 開頭,所以這條規則將匹配到所有請求.用戶只要是能訪問到該主機的IP或域名,即使不輸入路徑,也能匹配到相關的網頁信息。(文件只要是存放在/var/www/html 中,或則更深的目錄也能被匹配到。例如:/var/www/html/test/ 下存放網頁,用戶訪問/test?也能夠匹配訪問到相關網頁)該匹配方式為location匹配中優先級最低的方式,只有其他location匹配方式均為成功,才會采用該方式?

示例三:一般匹配?
#匹配規則a:
location /cxk/ {
root  /var/www/html
index index.html
}#匹配規則b:
location /cxk/abc {
root  /aaa/bbb/ccc
index index.html
}

匹配規則a:匹配任何以 /cxk/ 開頭的地址,匹配符合以后,還要繼續往下搜索其它 location只有其它 location后面的前綴路徑沒有匹配到時,才會采用這一條

匹配規則b:匹配任何以 /cxk/abc 開頭的地址,匹配符合以后。還要繼續往下搜索其它 location只有其它 location后面的前綴路徑沒有匹配到時,才會采用這一條

問題1:如果用戶用戶請求訪問該nginx主機的 /documents/,會采用哪條匹配規則?

配置設置:

該實驗階段建議實驗結束后,將匹配規則a和匹配規則b的上下關系進行調換再實驗一次(實驗兩次,排除優先級是因為上下順序導致的)?

?

結論:一般匹配時,location后面跟著的路徑長度越長?,則匹配的優先級越高?

?問題2:如果規則a和規則b? location 后面跟著路徑一樣長時,用戶訪問該nginx主機的 /documents/,會采用哪條匹配規則??

#匹配規則alocation /documents/abc {root /aaa/bbb/ccc; index index.html ;}#匹配規則blocation /documents/test {root /var/www/html;index index.html;}    

?

?結論: 同長度的location 后面的路徑,匹配規則不隨規則設置的上下順序而發生優先級改變。如果兩則的后面路徑有共同處(例如 /documents/test 和 /documents/abc? 的共同處是 /documents ),則需要用戶訪問路徑時填寫的更加詳細,否則無法找到網頁?

2.5 location的運用拓展?

#第一個必選規則
直接匹配網站根目錄首頁,通過域名訪問網站首頁比較頻繁,使用這個會加速處理,比如說官網。
可以是一個靜態首頁,也可以直接轉發給后端應用服務器

location = /index.html {root ? html;index ?index.html index.htm;
}

?#第二個必選規則是處理靜態文件請求,這是nginx作為http服務器的強項
有兩種配置模式,目錄匹配或后綴匹配,任選其一或搭配使用

location ^~ /static/ {root /webroot/;
}location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {root /webroot/res/;
}

?#第三個規則就是通用規則,比如用來轉發帶.php、.jsp后綴的動態請求到后端應用服務器
非靜態文件請求就默認是動態請求

location / {proxy_pass http://tomcat_server;
}

優先級總結:

(location = 完整路徑) > (location ^~ 路徑) > (location ~,~* 正則順序) > (location 部分前綴路徑) > (location /)
location 匹配:

1.首先看 優先級:精確= > 前綴^~ > 正則~,~* > 一般 > 通用/

2.在沒有精準匹配的情況下,先看前綴匹配的長度,然后根據最長的前綴匹配的優先級去確定是否再去看其它正則匹配location,
3.如果最長的前綴匹配帶有 ^~ 則不再看其它正則匹配location,如果最長的前綴匹配是沒有修飾符的一般匹配則會再看其它正則匹配location

4.前綴匹配看長度,最長的優先匹配
5.正則匹配看上下順序,由上往下依次匹配,當有匹配成功時候,停止匹配,按當前匹配規則處理請求

6.只有在精準、前綴、正則、一般 都沒有匹配到的時候才會看通用匹配

?三、rewrite重寫

3.1 rewrite 的功能介紹?

Rewrite使用nginx提供的全局變量,或者您自己設置的變量,結合正則表達式和標記位來實現URL的重寫和重定向。 例如,如果您希望在更改域名后能夠跳轉到新域名,則需要保留舊域名。一個特定的網頁應該跳轉到一個新的頁面,如果它改變。如網站的防盜鏈。 要求。

rewrite只能放在server{},location{},if{}中,并且默認只能對域名后邊的除去傳遞的參數外的字符串起作用,
例如?http://www.kgc.com/abc/bbs/index.php?a=1&b=2?只對/abc/bbs/index.php重寫。

3.2?rewrite跳轉實現

Nginx:通過ngx_http_rewrite_module 模塊支持URL重寫、支持if條件判斷,但不支持else
跳轉:從一個 location跳轉到另一個location,循環最多可以執行10次,超過后nginx將返回500錯誤
PCRE支持:perl兼容正則表達式的語法規則匹配
重寫模塊 set 指令:創建新的變量并設其值

3.3?rewrite 執行順序

(1) 執行 server 塊里面的 rewrite 指令。
(2) 執行 location 匹配。
(3) 執行選定的 location 中的 rewrite 指令。

語法格式:rewrite <regex> <replacement> [flag];
regex :表示正則匹配規則。
replacement :表示跳轉后的內容。
flag :表示 rewrite 支持的 flag 標記。

3.4?flag標記說明

last :本條規則匹配完成后,不終止重寫后的url匹配,一般用在 server 和 if 中。
break :本條規則匹配完成即終止,終止重寫后的url匹配,一般使用在 location 中。
redirect :返回302臨時重定向,瀏覽器地址會顯示跳轉后的URL地址。
permanent :返回301永久重定向,瀏覽器地址欄會顯示跳轉后的URL地址。

3.5 示例

(1)基于舊域名跳轉到新域名后面加目錄

將請求http://bbs.cxk.com/abc/index.php的訪問跳轉到http://www.cxk.com/bbs/abc/index.php,保證原域名后面的uri路徑不變

vim /usr/local/nginx/conf/nginx.conflocation /abc/ {rewrite ^/abc/(.*)$ http://www.cxk.com/bbs/abc/$1 permanent;}

測試:?

(2)基于域名的跳轉
vim /usr/local/nginx/conf/nginx.conf
server {listen       80;server_name  www.cxk.com;		#域名修改	charset utf-8;access_log  /var/log/nginx/www.cxk.com-access.log;		#日志修改location / {#添加域名重定向if ($host = 'www.cxk.com'){						#$host為rewrite全局變量,代表請求主機頭字段或主機名rewrite ^/(.*)$ http://www.xhz.com/$1 permanent;	#$1為正則匹配的內容,即“域名/”之后的字符串}root   html;index  index.html index.htm;}
}echo "192.168.136.100 www.xhz.com www.cxk.com" >> /etc/hosts
systemctl restart nginx

測試:

?

將請求http://www.xhz.com/bbs/index.html跳轉到http://www.cxk.com/bbs/index.html,保證原域名后面的uri路徑不變?

location /bbs/index.php {rewrite ^ http://www.kgc.com/$url permanent;
}

測試:

?

(3)基于客戶端 IP 訪問跳轉?

將對http://www.cxk.com網站的所有請求跳轉到自定義的維護頁面

vim /usr/local/nginx/conf/nginx.confset $rewrite true;  #設置變量$rewrite,變量值為boole值trueif ($remote_addr = "192.168.136.100") {  #當客戶端IP為192.168.80.10時,將變量值設為false,不進行重寫
set $rewrite false;   
}
if ($rewrite = true) {     #當變量值為true時,進行重寫rewrite (.*) /weihu.html; #將域名后邊的路徑重寫成/weihu.html后轉發,例如www.cxk.com/weihu.html
}
location = /weihu.html {
root /var/www/html;   #網頁返回/var/www/html/weihu.html的內容
}

?

如果rewrite (.+) /weihu.html; 換成rewrite (.+) /weihu.html permanent; 的話,若不是 192.168.80.10 的主機訪問會使瀏覽器修改請求訪問的 URL 成 http://www.kgc.com/weihu.html 再請求訪問,這樣就會進入一直在 rewrite 的死循環,訪問請求會一直被重寫成 http://www.kgc.com/weihu.html 再請求訪問

?(4)基于最普通一條 url 請求的跳轉

將請求http://www.cxk.com/abc/123.html 跳轉到首頁http://www.cxk.com

測試:?

(5) 基于目錄下所有 php 結尾的文件跳轉

需求:要求訪問 http://www.yang.com/upload/123.php 跳轉到首頁。

配置設置:

vim /usr/local/nginx/conf/nginx.conf
server {listen       80;server_name  www.xhz.com;		#域名修改	charset utf-8;access_log  /var/log/nginx/www.xhz.com-access.log;location ~* /upload/.*\.php$ {rewrite (.+) http://www.xhz.com permanent;}location / {root   html;index  index.html index.htm;}
}systemctl restart nginx

訪問結果:

瀏覽器訪問 http://www.yang.com/upload/123.php 跳轉到http://www.yang.com頁面。

(6)基于參數匹配的跳轉

?需求:現在訪問http://www.xhz.com/100-(100|200)-100.html 跳轉到http://www.xhz.com頁面

配置設置 :

vim /usr/local/nginx/conf/nginx.conf
server {listen       80;server_name  www.xhz.com;		#域名修改	charset utf-8;access_log  /var/log/nginx/www.xhz.com-access.log;if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {rewrite (.+) http://www.xhz.com permanent;}location / {root   html;index  index.html index.htm;}
}#############特殊變量說明##########################
$request_uri:包含請求參數的原始URI,不包含主機名,如:http://www.yang.com/abc/bbs/index.html?a=1&b=2 中的 /abc/bbs/index.php?a=1&b=2
$uri:這個變量指當前的請求URI,不包括任何參數,如:/abc/bbs/index.html
$document_uri:與$uri相同,這個變量指當前的請求URI,不包括任何傳遞參數,如:/abc/bbs/index.html

重啟nginx服務,訪問結果:

使用瀏覽器訪問 http://www.xhz.com/100-200-100.html 或 http://www.cxk.com/100-100-100.html 跳轉到http://www.xhz.com頁面。
?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/214188.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214188.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214188.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vue3 setup 頁面跳轉監聽路由變化調整頁面訪問位置

頁面跳轉后頁面還是停留在上一個頁面的位置&#xff0c;沒有回到頂部 解決 1、router中路由守衛中統一添加 router.beforeEach(async (to, from, next) > {window.scrollTo(0, 0);next(); }); 2、頁面中監聽頁面變化 <script setup> import { ref, onMounted, wat…

@Autowired 找不到Bean的問題

排查思路 檢查包掃描&#xff1a;查詢的Bean是否被spring掃描裝配到檢查該Bean上是否配上注解&#xff08;Service/Component/Repository…&#xff09;如果使用第三方&#xff0c;檢查相關依賴是否已經安裝到當前項目 Autowired和Resource的區別 Autowired 是spring提供的注…

圖像清晰度 和像素、分辨率、鏡頭的關系

關于圖像清晰度的幾個知識點分享。 知識點 清晰度 清晰度指影像上各細部影紋及其邊界的清晰程度。清晰度&#xff0c;一般是從錄像機角度出發&#xff0c;通過看重放圖像的清晰程度來比較圖像質量&#xff0c;所以常用清晰度一詞。 而攝像機一般使用分解力一詞來衡量它“分解被…

linux通過命令切換用戶

在Linux中&#xff0c;你可以使用su&#xff08;substitute user或switch user&#xff09;命令來切換用戶。這個命令允許你臨時或永久地以另一個用戶的身份運行命令。以下是基本的用法&#xff1a; 基本切換到另一個用戶&#xff08;需要密碼&#xff09;&#xff1a;su [用戶…

APIFox:打造高效便捷的API管理工具

隨著互聯網技術的不斷發展&#xff0c;API&#xff08;應用程序接口&#xff09;已經成為了企業間數據交互的重要方式。然而&#xff0c;API的管理和維護卻成為了開發者們面臨的一大挑戰。為了解決這一問題&#xff0c;APIFox應運而生&#xff0c;它是一款專為API管理而生的工具…

【力扣100】189.輪轉數組

添加鏈接描述 class Solution:def rotate(self, nums: List[int], k: int) -> None:"""Do not return anything, modify nums in-place instead."""# 思路&#xff1a;三次數組翻轉nlen(nums)kk%nnums[:] nums[-k:] nums[:-k]思路就是&…

數據科學實踐:探索數據驅動的決策

寫在前面 你是否曾經困擾于如何從海量的數據中提取有價值的信息?你是否想過如何利用數據來指導你的決策,讓你的決策更加科學和精確?如果你有這樣的困擾和疑問,那么你來對了地方。這篇文章將引導你走進數據科學的世界,探索數據驅動的決策。 1.數據科學的基本原則 在我們…

第四屆傳智杯初賽(蓮子的機械動力學)

題目描述 題目背景的問題可以轉化為如下描述&#xff1a; 給定兩個長度分別為 n,m 的整數 a,b&#xff0c;計算它們的和。 但是要注意的是&#xff0c;這里的 a,b 采用了某種特殊的進制表示法。最終的結果也會采用該種表示法。具體而言&#xff0c;從低位往高位數起&#xf…

【linux】yum安裝時: Couldn‘t resolve host name for XXXXX

yum 安裝 sysstat 報錯了&#xff1a; Kylin Linux Advanced Server 10 - Os 0.0 B/s | 0 B 00:00 Errors during downloading metadata for repository ks10-adv-os:- Curl error (6): Couldnt resolve host nam…

在非Spring環境下Main方法中,怎么使用spring的ThreadPoolTaskScheduler啟動Scheduler?

作為Java開發人員&#xff0c;在使用spring框架的時候&#xff0c;如果想要獲取到線程池對象&#xff0c;可以直接使用spring框架提供的ThreadPoolxxx來獲取。那么在非spring環境下&#xff0c;main函數怎么使用ThreadPoolTaskScheduler呢&#xff1f;下面凱哥(凱哥Java:kaigej…

10.vue3項目(十):spu管理頁面的sku的新增和修改

目錄 一、sku靜態頁面的搭建 1.思路分析 2.代碼實現 3.效果展示

微信小程序 長按錄音+錄制視頻

<view class"bigCircle" bindtouchstart"start" bindtouchend"stop"><view class"smallCircle {{startVedio?onVedio:}}"><text>{{startVedio?正在錄音:長按錄音}}</text></view> </view> <…

排序算法:【選擇排序]

一、選擇排序——時間復雜度 定義&#xff1a;第一趟排序&#xff0c;從整個序列中找到最小的數&#xff0c;把它放到序列的第一個位置上&#xff0c;第二趟排序&#xff0c;再從無序區找到最小的數&#xff0c;把它放到序列的第二個位置上&#xff0c;以此類推。 也就是說&am…

軟件項目管理---胡亂復習版

范圍控制的一個重點是避免需求的不合理擴張。(√)一個任務原計劃2個人全職工作2周完成,而實際上只有一個人參與這個任務,到第二周末這個人完成了任務的75%,那么:BCWS = 4人周,ACWP = 2人周,BCWP = 3人周。CV = 1,SV = -1。 【在項目管理中,BCWS、ACWP和BCWP是用來衡量…

微服務測試是什么?

微服務測試是一種特殊的測試類型&#xff0c;因為它涉及到多個獨立的服務。以下是進行微服務測試的一般性步驟&#xff1a; 1. 確定系統架構 了解微服務架構對成功測試至關重要。確定每個微服務的職責、接口、依賴項和通信方式。了解這些信息可以幫助您更好地規劃測試用例和測…

ip ssl證書怎么更換ip地址

ip ssl證書是一種數字證書&#xff0c;為只有公網ip地址的站點建立安全、加密的通信通道。它通常由權威的證書頒發機構&#xff08;CA&#xff09;頒發&#xff0c;并用于驗證網站的身份和安全性。ip ssl證書的主要目的是保護敏感信息&#xff0c;如信用卡號、用戶名和密碼等&a…

IO部分筆記

IO 概述 IO: 存儲和讀取數據的解決方案 作用: 用于讀寫文件中的數據(可以讀寫文件, 或網絡中的數據) IO流的分類 按流的方向: 輸入流, 輸出流 按操作文件類型: 字節流: 可以操作所有類型的文件 字符流: 只能操作純文本文件 純文本文件: windows自帶的記事本打開能讀懂…

react Hooks(useRef、useMemo、useCallback)實現原理

Fiber 上篇文章fiber簡單理解記錄了react fiber架構&#xff0c;Hooks是基于fiber鏈表來實現的。閱讀以下內容時建議先了解react fiber。 jsx -> render function -> vdom -> fiber樹 -> dom vdom 轉 fiber 的過程稱為 recocile。diff算法就是在recocile這個過程…

認識lambda架構(架構師考試復習)

Lambda架構主要分為三層&#xff0c;批處理層、加速層和服務層。 如下圖所示&#xff1a; &#xff08;1&#xff09;批處理層&#xff08;Batch Layer&#xff09;&#xff1a;存儲數據集&#xff0c;在數據集上預先計算查詢函數&#xff0c;并構建查詢對應的view。Batch Lay…

mysql 5.7 Unknown column ‘password‘ in ‘field list‘

問題現象&#xff1a; 執行sql : select user&#xff0c;host,password from user&#xff1b;時提示 ERROR 1054(42S22):Unknown column password in field list 現象如下圖所示&#xff1a; mysql 5.7開始 密碼字段用&#xff1a;authentication_string