Nginx的Location匹配與Rewrite重寫

目錄

一.Nginx中location與rewrite

1.Nginx中常用正則表達式

2.location與rewrite的聯系和區別

二.location概述

1.分類

2.匹配規則

3.優先級

4.示例

三.rewrite概述

1.rewrite功能

2.rewrite執行順序

3.跳轉實現

4.語法格式

5.示例

5.1.基于域名的跳轉

5.2.基于舊域名跳轉到新域名后面加目錄


一.Nginx中location與rewrite

1.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]匹配所有大小寫字母或數字
()表達式的開始和結束位置
|或運算符

2.location與rewrite的聯系和區別

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

從功能看 rewrite 和 location 似乎有點像,都能實現跳轉,主要區別在于 rewrite 是在同一域名內更

改獲取資源的路徑,而 location 是對一類路徑做控制訪問或反向代理,還可以proxy_pass 到其他

機器

二.location概述

1.分類

location 大致可以分為三類

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

2.匹配規則

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

3.優先級

優先級:精準匹配 = ?> ?最長前綴匹配 ^~ ?> ?正則匹配 ~ ~* !~ !~* ?> ?一般前綴匹配 /XXXX ?> ?通用

匹配 /

  • 在沒有合適的精準匹配的情況下,先看前綴匹配的長度,取最長匹配的location(如果此最長匹配是帶有^~的則不再看正則匹配;如果此最長匹配是不帶有^~的則會繼續再看正則匹配)
  • 前綴匹配看長度,最長的優先匹配;正則匹配看上下順序,根據nginx配置文件的配置由上往下依次匹配,匹配到即停止

4.示例

(1)location = / {}

=為精確匹配 / ,主機名后面不能帶任何字符串,比如訪問 / 和 /data,則 / 匹配,/data 不匹配

再比如?location = /abc,則只匹配/abc ,/abc/或 /abcd不匹配。若?location??/abc,則即匹配/abc

、/abcd/ 同時也匹配 /abc/

(2)location / {}

因為所有的地址都以 / 開頭,所以這條規則將匹配到所有請求 比如訪問 / 和 /data, 則 / 匹配,

/data 也匹配,

但后面前綴路徑會和最長字符串優先匹配(最長匹配)

(3)location /documents/ {}

匹配任何以 /documents/ 開頭的地址,匹配符合以后,還要繼續往下搜索其它 location

只有其它 location后面的前綴路徑沒有匹配到時,才會采用這一條

(4)location /documents/abc {}

匹配任何以 /documents/abc 開頭的地址,匹配符合以后,還要繼續往下搜索其它 location

只有其它 location后面的前綴路徑沒有匹配到時,才會采用這一條

(5)location ^~ /images/ {}

匹配任何以 /images/ 開頭的地址,匹配符合以后,停止往下搜索正則,采用這一條

(6)location ~* \.(gif|jpg|jpeg)$ {}

匹配所有以 gif、jpg或jpeg 結尾的請求

然而,所有請求 /images/ 下的圖片會被 location ^~ /images/ 處理,因為 ^~ 的優先級更高,所以

到達不了這一條正則

(7)location /images/abc {}

最長字符匹配到 /images/abc,優先級最低,繼續往下搜索其它 location,會發現 ^~ 和 ~ 存在

(8)location ~ /images/abc {}

匹配以/images/abc 開頭的,優先級次之,只有去掉 location ^~ /images/ 才會采用這一條

(9)location /images/abc/1.html {}

匹配/images/abc/1.html 文件,如果和正則location ~ /images/abc/1.html 相比,正則優先級更高

三.rewrite概述

1.rewrite功能

使用nginx提供的全局變量或自己設置的變量,結合正則表達式和標記位實現URL重寫以及重定向

  • 更換域名后需要保持舊的域名能跳轉到新的域名上
  • 某網頁發生改變需要跳轉到新的頁面
  • 網站防盜鏈等等需求

注意:rewrite只能放在server{},location{},if{}中,并且默認只能對域名后邊的除去傳遞的參數外的

字符串起作用

例如?http://www.xy101.com/abc/bbs/index.php?a=1&b=2?只對/abc/bbs/index.php重寫

2.rewrite執行順序

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

3.跳轉實現

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

4.語法格式

rewrite <regex> <replacement> [flag];

  • regex :表示正則匹配規則
  • replacement :表示跳轉后的內容
  • flag :表示 rewrite 支持的 flag 標記

補充:flag標記說明

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

5.示例

5.1.基于域名的跳轉

現在公司舊域名www.xx10.com有業務需求變更,需要使用新域名www.xx11.com代替,但是舊

域名不能廢除,需要跳轉到新域名上,而且后面的參數保持不變

vim /usr/local/nginx/conf/nginx.conf
server {listen       80;server_name  www.xx10.com;		                      #域名修改	charset utf-8;access_log  /var/log/nginx/www.xx10.com-access.log;  #日志修改location / {#添加域名重定向if ($host = 'www.xx10.com'){					  #$host為rewrite全局變量,代表請求主 機頭字段或主機名rewrite ^/(.*)$ http://www.xx11.com/$1 permanent;	#$1為正則匹配的內容,即“域名/”之后的字符串}root   html;index  index.html index.htm;}
}echo "192.168.80.101 www.xx10.com www.xx11.com" >> /etc/hosts
systemctl restart nginx
瀏覽器輸入模擬訪問 http://www.xx10.com/test/1.html(雖然這個請求內容是不存在的)
會跳轉到www.xx11.com/test/1.html,查看元素可以看到返回301,實現了永久重定向跳轉,而且域名后的參數也正常跳轉。

5.2.基于舊域名跳轉到新域名后面加目錄

現在訪問的是 http://bbs.xx10.com/post/,現在需要將這個域名下面的訪問都跳轉到

http://www.xx10.com/bbs/post/

vim /usr/local/nginx/conf/nginx.conf
server {listen       80;server_name  bbs.xx10.com www.xx10.com;		          #域名修改	charset utf-8;access_log  /var/log/nginx/www.xx10.com-access.log;#添加location /post {rewrite (.+) http://www.xx10.com/bbs$1 permanent;	  #這里的$1為位置變量,代表/post}location / {root   html;index  index.html index.htm;}
}mkdir -p /usr/local/nginx/html/bbs/post
echo "this is 1.html"  >> /usr/local/nginx/html/bbs/post/1.html
echo "192.168.80.101 bbs.xx10.com"  >> /etc/hosts
systemctl restart nginx
使用瀏覽器訪問 http://bbs.xx10.com/post/1.html 跳轉到 http://www.xx10.com/bbs/post/1.html

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

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

相關文章

四、利用啟發式算法進行特定數據集的殘差網絡結構搜索【框架+源碼】

背景&#xff1a;工作之后干的事情跟算法關聯甚少&#xff0c;整理下讀書期間的負責和參與的work&#xff0c;再熟悉學習下。 邊熟悉邊整理嘍~ CV Tradictional workCV AI based work機械臂視覺抓取項目機器學習全流程 Pipeline訓練平臺OCR生產線噴碼識別三維重建(SfM)ROS機器人…

C++的vector使用優化

我們在上一章說了如何使用這個vector動態數組&#xff0c;這章我們說說如何更好的使用它以及它是如何工作的。當你創建一個vector&#xff0c;然后使用push_back添加元素&#xff0c;當當前的vector的內存不夠時&#xff0c;會從內存中的舊位置復制到內存中的新位置&#xff0c…

Spring 之 Lifecycle 及 SmartLifecycle

最近在看Eureka源碼&#xff0c;本想快速解決這場沒有硝煙的戰役&#xff0c;不曾想阻塞性問題一個接一個。為正確理解這個框架&#xff0c;我不得不耐著性子&#xff0c;慢慢梳理這些讓人困惑的點。譬如本章要梳理的Lifecycle和SmartLifecycle。它們均為接口&#xff0c;其中后…

mysql的鎖(全局鎖)

文章目錄 mysql按照鎖的粒度分類全局鎖概念&#xff1a;全局鎖使用場景&#xff1a;全局鎖備份案例&#xff1a; mysql按照鎖的粒度分類 全局鎖 概念&#xff1a; 全局鎖就是對整個數據庫實例加鎖。MySQL 提供了一個加全局讀鎖的方法&#xff0c;命令是: Flush tables with…

java —— 文件的創建、刪除、查詢和重命名

文件的相關操作通過 File 類并引入路徑來實現&#xff0c;這里對文件的操作只是對文件本身的增、刪、查等&#xff0c;不包括對文件內容的修改。 一、創建文件/文件夾 public static void main(String[] args) {//創建文件File file1new File("D:\\android\\test\\a.jpg…

vue封裝url驗證方法

vue封裝url驗證方法 在 Vue 中&#xff0c;你可以封裝一個 URL 驗證的方法來驗證給定的 URL 是否有效。以下是一個示例代碼&#xff1a; export const validateUrl (url) > {const regex /^(https?:\/\/)?([\da-z.-])\.([a-z.]{2,6})([/\w .-]*)*/;return regex.test(…

排序算法——歸并排序以及非遞歸實現

一、歸并排序思想 歸并排序&#xff08;MERGE-SORT&#xff09;是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法&#xff08;Divide andConquer&#xff09;的一個非常典型的應用。將已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每個子序列…

OkHttp,一個賊牛的Java工具包

在當今的網絡應用開發中,Java 作為一種成熟的編程語言,廣泛應用于服務器端和客戶端的開發。網絡請求作為應用開發中不可或缺的一部分,選擇一個高效、穩定的網絡庫尤為重要。OkHttp 就是這樣一款優秀的網絡庫,它為Java提供了簡單易用、功能強大的網絡請求能力。本文將向讀者…

關于編譯的一些思路和猜想

一、編譯原理的難度 編譯原理特別復雜&#xff0c;研究的是高級語言如何翻譯成匯編語言的過程。 二、編譯過程中一些思路 (一)語義識別的作用 語義識別指的是把一些無關字符忽略&#xff0c;把一些變量名保存在一起&#xff0c;把用空格隔開的關鍵字單獨放一起。 例如&#…

重新ysyx

一、克隆倉庫 1.創建ssh key ssh-keygen -t rsa cd ~/.ssh ls 查看里面是否有id_rsa id_rsa.pub ssh-keygen -t rsa -C "xiantong15834753336outlook.com" cat id_rsa.pub***********查看里面的內容&#xff0c;復制到下圖中綠色的按鈕 git init ssh -T g…

spark3.0.1版本查詢Hbase數據庫例子

需求背景 現有需求&#xff0c;需要采用spark查詢hbase數據庫的數據同步到中間分析庫&#xff0c;記錄spark集成hbase的簡單例子代碼 import org.apache.hadoop.hbase.HBaseConfiguration import org.apache.hadoop.hbase.client.{ConnectionFactory, Scan} import org.apach…

Marin說PCB之Max parallel知多少?

今天是個陽光明媚&#xff0c;萬里烏云的好日子。小編我一如既往地到家打開電腦準備看騰訊視頻的五十公里桃花塢的第四季&#xff0c;在看到汪蘇瀧汪臺說650電臺要解散的時候小編我差點也哭了。650電臺之于桃花塢就像樂隊的鼓手一樣&#xff0c;都是一個團隊的靈感啊&#xff0…

CSS中的長度單位詳解

在CSS中&#xff0c;長度單位是定義元素尺寸、間距、邊距等的重要工具。不同的長度單位具有不同的特性和使用場景。 絕對長度單位 絕對長度單位在所有設備和瀏覽器中表示相同的長度。這些單位包括&#xff1a; 1.像素&#xff08;px&#xff09; 像素是最常用的長度單位。一…

C語言分支和循環(2)

我的相關博客&#xff1a; C語言的分支與循環&#xff08;1&#xff09; 1.switch語句 除了 if 語句外&#xff0c;C語?還提供了 switch 語句來實現分?結構。 switch 語句是?種特殊形式的 的 if...else 結構&#xff0c;?于判斷條件有多個結果的情況。它把多重 else if…

非質量成本總結

非質量成本 非質量成本 定義 舉例 固定成本 不隨生產量或工作量變動而變動的成本 辦公室租賃費 可變成本 隨著生產量或工作變動而變動的成本 材料費 直接成本 可以直接計入某項目的成本 工人工資 間接成本 不能直接計入某項目而需要再幾個項目之間或在項目與職能部…

Linux基本指令3

Linux基本指令3 目錄 Linux基本指令3 一、Linux文件系統管理 二、Linux進程與服務管理

億發:制造型企業信息化規劃——從破冰到全面落地

在制造型企業中&#xff0c;信息化規劃的落地是一個復雜而關鍵的過程。盡管規劃和藍圖可能已經制定完畢&#xff0c;但如何成功地實施信息化才是關鍵所在。本文將詳細介紹制造型企業信息化規劃的落地過程&#xff0c;通過三個周期逐步推進&#xff0c;最終實現信息化與自動化的…

深度學習知識與心得

目錄 深度學習簡介 傳統機器學習 深度學習發展 感知機 前饋神經網絡 前饋神經網絡&#xff08;BP網絡&#xff09; 深度學習框架講解 深度學習框架 TensorFlow 一個簡單的線性函數擬合過程 卷積神經網絡CNN&#xff08;計算機視覺&#xff09; 自然語言處理NLP Wo…

OpenAI助手API接入-問答對自動生成

支持GPT-3.5-Turbo, GPT-4o, GPT-4-Turbo import json import openai from pathlib import Path import os client openai.OpenAI(base_urlbase_url, api_keyapi_key) file client.files.create( fileopen("H3.pdf", "rb"), purposeassistants ) …

HTTP 的三次握手

????? HTTP 的三次握手是指在建立 TCP 連接時&#xff0c;客戶端和服務器之間進行的三步握手過程。這個過程確保了雙方都能夠互相通信&#xff0c;并且同步了彼此的序列號和確認號。 概念&#xff1a; 第一次握手&#xff1a;客戶端發送一個 SYN&#xff08;同步…