最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Nginx之rewrite實現(xiàn)URL重寫方式

 更新時間:2025年03月05日 11:19:59   作者:fkjavaer  
文章介紹了Nginx的rewrite模塊,包括其重要性、相關指令(如set、if、break、return、rewrite)的使用方法和作用域,并舉例說明了這些指令的實際應用場景,如域名重定向和防盜鏈處理

1.開篇

rewrite是nginx服務器提供的一個重要功能,用于實現(xiàn)URL的重寫。

例如我們訪問https://aa.qq.com,打開的是https://age.qq.com/,這就是使用URL重寫的特性來實現(xiàn)的。

ngx_http_rewrite_module為實現(xiàn)URL重寫提供了指令支持。

官方文檔地址:https://nginx.org/en/docs/http/ngx_http_rewrite_module.html

接下來我們來看看rewrite的相關指令。

2.rewrite相關指令

2.1 set指令

作用域:server, location, if

語法:set $variable value;

該指令可以設置一個變量。

  • $variable:為變量的名稱,可以看到變量的名稱以$符號開頭,且不要與nginx預設的全局變量名相同。
  • value:為變量的值,可以是字符串、其他變量或者兩者的組合。

既然自定義的變量名不能與nginx的全局變量名相同,那就有必要了解使用rewrite功能時常用的nginx全局變量。

rewrite常用全局變量

全局變量說明
$args用于獲取請求中的參數(shù)。例如:http://192.168.110.92/test?name=tom&age=18,$args的值就為name=tom&age=18
$host用于獲取請求中的主機部分的值。例如:http://192.168.110.92/test?name=tom&age=18,$host的值為192.168.110.92。
$http_user_agent用于獲取請求中的User-Agent字段值
$remote_addr用于獲取客戶端的IP地址
$remote_port用于獲取客戶端與服務器建立連接的端口號
$request_method用于獲取客戶端的請求方式,例如GET、POST等
$request_uri用于獲取當前請求的URI。例如:http://192.168.110.92/test?name=tom&age=18,$request_uri的值就為/test?name=tom&age=18
$query_string與$args作用相同
$scheme用于獲取客戶端請求使用的協(xié)議,例如http、https等
$server_addr用于獲取服務端的IP地址
$server_name用于獲取虛擬主機的名稱
$server_port用于獲取虛擬主機的監(jiān)聽的端口
$document_uri用于獲取請求中的當前URI。例如:http://192.168.110.92/test?name=tom&age=18,$document_uri的值為/test
$uri與$document_uri作用相同
$http_user_agent用于獲取請求頭中User-Agent字段的值
$request_filename當前請求的文件路徑

下面我們設置自定義變量,順便體驗使用一下這些全局變量。

location /test {
	default_type text/html;
	set $username zhangsan;
	return 200 <html>><p>username:$username</p><p>request_uri:$request_uri</p><p>document_uri:$document_uri</p><p>uri:$uri</p><p>query_string:$query_string</p><p>args:$args</p></html>;
}

發(fā)起請求:http://192.168.110.98/test?name=tom

2.2 if指令

作用域:server, location

語法:if (condition) { … }

如果條件表達式為true,則執(zhí)行該模塊大括號中的指令。

Tips:if(之間有一個空格。

條件表達式有幾種形式:

1)變量名,如果變量的值為空字符串或"0",則為false,其他條件為true。

if ($variable){

}

2)使用"=“和”!="比較變量和字符串是否相等,滿足條件則為true,否則為false。

if ($request_method = POST){

}

3)使用正則表達式與變量的值進行匹配。變量與正則表達式之間使用~、~*!~、!~*,如果正則表達式包含};,則整個表達式應該用單引號或雙引號括起來。

  • ~:表示匹配正則表達式,區(qū)分大小寫
  • ~*:表示匹配正則表達式,不區(qū)分大小寫
  • !~:表示匹配正則表達式,區(qū)分大小寫,并對匹配后的結(jié)果取反
  • !~*:表示匹配正則表達式,不區(qū)分大小寫,并對匹配后的結(jié)果取反
if ($http_user_agent ~ Mozilla/5.0){

}

4)判斷文件是否存在:-f!-f

if (-f $request_filename){

}
if (!-f $request_filename){

}

示例:

location /test {
	default_type text/html;
	if (!-f $request_filename){
		return 200 "<h1>file not exist</h1>";
	}
	root html;
}

我們已經(jīng)在html目錄下準備了一個test.html。

訪問http://192.168.110.98/test.html,可以正常顯示。

訪問http://192.168.110.98/test,因為文件不存在,所以執(zhí)行if條件塊的指令。

5)判斷目錄是否存在:-d!-d

6)判斷文件、目錄或符號鏈接是否存在:-e!-e

7)判斷文件是否可以執(zhí)行:-x!-x

2.3 break指令

作用域:server, location, if;

語法:break;

在同一作用域中,中斷該指令之后的其他指令,位于其前面的指令配置生效,位于其后面的指令配置則無效。

示例:如果URL中存在參數(shù),則執(zhí)行if邏輯。

location /testBreak {
	default_type text/plain;
	set $username lisi;
	if ($args){
	set $username wangwu;
		break;
		set $username zhaoliu;
	}
	add_header username $username;
	return 200 $username;
}

訪問http://192.168.110.98/testBreak,指令都正常執(zhí)行。

訪問http://192.168.110.98/testBreak?name=zhangsan,說明執(zhí)行了if邏輯。

break;語句的定義來說,在其執(zhí)行后,其作用域外后面的指令應該正常執(zhí)行才對,但是這里直接返回了404。這個時候,就需要我們查看error.log

可以發(fā)現(xiàn),錯誤提示為文件未找到,根據(jù)錯誤提示,我們需要在html目錄下創(chuàng)建一個testBreak目錄,然后在testBreak目錄下創(chuàng)建一個index.html文件

cd /usr/local/nginx
mkdir testBreak
vim index.html

<html>
    <body>this is testBreak</body>
</html>

再次訪問http://192.168.110.98/testBreak?name=zhangsan,可以看到break語句執(zhí)行后,其作用域外后面的指令正常執(zhí)行。

2.4 return指令

作用域

  • server, location, if

語法

  • return code [text];
  • return code URL;
  • return URL;

該指令可以停止處理并指定的響應碼返回給前端。既可以返回文本,也可以重定向URL。

示例:

location /testReturn {
	default_type text/plain;
	return 200 "test return";
}
location /testReturn {
	return 302 https://www.baidu.com;
}
location /testReturn {
	return https://www.baidu.com;
}

2.5 rewrite指令

在了解set、ifbreak、return指令后,重頭戲rewrite指令登場。

作用域:server, location, if;

語法:rewrite regex replacement [flag];

  • regex:用來匹配URI的正則表達式。
  • replacement:正則匹配成功后,用來替換URI的字符串。如果該字符串以http://https://$scheme開頭,則處理將停止,并重定向URI到客戶端。
  • flag:是一個可選參數(shù),其有4個候選值。
flag值說明
last停止處理rewrite指令,并使用重寫的URI去與各個location進行匹配
break停止處理rewrite指令,與break;效果一致
redirect如果replacement字符串不是以http://、https://或$scheme開頭,則重定向到重寫的URI,響應碼為302
permanent重定向到重寫的URI,響應碼為301

rewrite指令通過正則表達式匹配URI,并修改URI??赏瑫r存在多個rewrite指令,按照順序依次對URI進行匹配和處理。

示例:

location /rewrite {
	rewrite ^/rewrite/aaa\w+$ https://www.baidu.com;
	rewrite ^/rewrite/(bbb)\w+$ /$1 last;
	rewrite ^/rewrite/(ccc)\w+$ /$1 break;
	rewrite ^/rewrite/(ddd)\w+$ /$1 redirect;
	rewrite ^/rewrite/(eee)\w+$ /$1 permanent;
}

location /bbb {
	default_type text/plain;
	return 200 "this is bbb";
}

location /ccc {
	default_type text/plain;
	return 200 "this is ccc";
}

location /ddd {
	default_type text/plain;
	return 200 "this is ddd";
}

location /eee {
	default_type text/plain;
	return 200 "this is eee";
}

2.6 rewrite_log指令

作用域:http, server, location, if

語法:rewrite_log on | off;

默認值:rewrite_log off;

該指令可以配置是否將ngx_http_rewrite_module指令的處理結(jié)果以notice級別的日志寫入到error_log中。

示例:

location /rewrite {
	# 開啟rewrite_log
	rewrite_log on;
	# 配置error_log
	error_log logs/error.log notice;
	rewrite ^/rewrite/aaa\w+$ https://www.baidu.com;
	rewrite ^/rewrite/(bbb)\w+$ /$1 last;
	rewrite ^/rewrite/(ccc)\w+$ /$1 break;
	rewrite ^/rewrite/(ddd)\w+$ /$1 redirect;
	rewrite ^/rewrite/(eee)\w+$ /$1 permanent;
}

這樣我們就可以在error.log中看到notice級別的日志。

3.使用場景

在熟悉了ngx_http_rewrite_module的相關指令后,我們來看看rewrite的相關使用場景。

3.1 域名重定向

**場景:**公司官網(wǎng)上線的時候地址為www.aaa.com,隨著公司的不斷發(fā)展,需要將官網(wǎng)地址升級為www.bbb.com,但是需要在訪問www.aaa.com能夠自動跳轉(zhuǎn)到www.bbb.com。

Tips:www.aaa.com和www.bbb.com需要指向同一IP。

**解決方案:**使用rewrite指令重寫URI。

server {
	listen 80;
	server_name www.aaa.com;
	rewrite ^(.*) https://www.bbb.com$1;
}

3.2 優(yōu)雅處理防盜鏈

前面我們在【Nginx靜態(tài)資源防盜鏈】一文中已經(jīng)簡單的實現(xiàn)了靜態(tài)資源的防盜鏈,但是展示在頁面的是一個裂開的小圖片,不夠美觀。

我們可以如下配置:

location ~^/.*\.(jpg|jpg|gif|jfif) {
	valid_referers www.example.com;
	if ($invalid_referer){
		rewrite ^/ http://192.168.110.98/images/forbidden.jpg;
	}
	root   html;
}

如果出現(xiàn)盜鏈的情況,將會出現(xiàn)類似于如下效果:

總結(jié)

以上就是Nginx之rewrite實現(xiàn)URL重寫,Nginx是多模塊化的,還有很多高級功能,我們后面繼續(xù)探索。

這些僅為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 如何本地安裝nginx及部署項目

    如何本地安裝nginx及部署項目

    這篇文章主要介紹了如何本地安裝nginx及部署項目問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • nginx搭建IPv6 ->IPv4反向代理服務器的實現(xiàn)

    nginx搭建IPv6 ->IPv4反向代理服務器的實現(xiàn)

    本文主要介紹了nginx搭建IPv6 ->IPv4反向代理服務器的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-05-05
  • Nginx配置https原理及實現(xiàn)過程詳解

    Nginx配置https原理及實現(xiàn)過程詳解

    這篇文章主要介紹了Nginx配置https原理及實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • Nginx輕松搞定跨域問題完整過程

    Nginx輕松搞定跨域問題完整過程

    這篇文章主要給大家介紹了關于Nginx輕松搞定跨域問題的相關資料,大家在使用nginx進行服務器管理,經(jīng)常會遇到跨域問題,文中將解決方法介紹的非常詳細,需要的朋友可以參考下
    2023-08-08
  • nginx禁止訪問.git文件的設置教程

    nginx禁止訪問.git文件的設置教程

    這篇文章主要介紹了nginx禁止訪問.git文件的設置教程,.git文件會包含一份文件列表,如果你的網(wǎng)站是基于git協(xié)作開發(fā)的,則必須要注意這個問題,需要的朋友可以參考下
    2014-08-08
  • Nginx實現(xiàn)動靜分離的示例代碼

    Nginx實現(xiàn)動靜分離的示例代碼

    這篇文章主要介紹了Nginx實現(xiàn)動靜分離的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • Nginx限制某個IP同一時間段的訪問次數(shù)和請求數(shù)示例代碼

    Nginx限制某個IP同一時間段的訪問次數(shù)和請求數(shù)示例代碼

    nginx可以通過ngx_http_limit_conn_module和ngx_http_limit_req_module配置來限制ip在同一時間段的訪問次數(shù).具體示例代碼大家參考下本文
    2017-08-08
  • Nginx可視化配置工具NginxWebUI的使用

    Nginx可視化配置工具NginxWebUI的使用

    本文主要介紹了Nginx可視化配置工具NginxWebUI的使用,可以使用?WebUI?配置?Nginx?的各項功能,包括端口轉(zhuǎn)發(fā),反向代理,ssl?證書配置,負載均衡等,感興趣的可以了解一下
    2022-01-01
  • Nginx列出目錄和文件并用密碼控制訪問權(quán)限配置方法

    Nginx列出目錄和文件并用密碼控制訪問權(quán)限配置方法

    這篇文章主要介紹了Nginx列出目錄和文件并用密碼控制訪問權(quán)限配置方法,本文給出了詳細的安裝配置步驟,需要的朋友可以參考下
    2015-07-07
  • nginx 作為反向代理實現(xiàn)負載均衡的例子

    nginx 作為反向代理實現(xiàn)負載均衡的例子

    以下我們就來舉例說明如何使用 nginx 實現(xiàn)負載均衡。因為nginx在處理并發(fā)方面的優(yōu)勢,現(xiàn)在這個應用非常常見。
    2010-12-12

最新評論

勐海县| 屏边| 静安区| 越西县| 嫩江县| 汾西县| 江永县| 永德县| 临江市| 柘荣县| 遂宁市| 清丰县| 涞源县| 永年县| 喀喇| 扶余县| 东丰县| 廊坊市| 慈溪市| 苏尼特右旗| 新巴尔虎左旗| 晋中市| 额济纳旗| 博爱县| 海安县| 恭城| 台安县| 沙田区| 邢台县| 淳化县| 峨眉山市| 孝昌县| 南召县| 徐州市| 如东县| 晋宁县| 井研县| 怀仁县| 花垣县| 西乌| 峨眉山市|