Nginx之rewrite重写功能

目录

一、rewrite概述

1、rewrite功能

2、跳转场景

二、标准配置指令

1、rewrite日志记录指令

2、未初始化变量告警日志记录指令

3、rewrite 指令

3.1 正则表达式

三、rewrite模块使用实例

1.基于域名的跳转

2.基于客户端 IP 访问跳转

3. 基于旧域名跳转到新域名后面加目录

4.基于参数匹配的跳转

5.基于目录下所有 php 结尾的文件跳转

6.基于最普通一条 url 请求的跳转


一、rewrite概述

1、rewrite功能

访问重写 rewrite 是 Nginx HTTP 请求处理过程中的一个重要功能,它是以模块的形式存在于代码中的,其功能是对用户请求的 URI 进行 PCRE 正则重写,然后返回 30× 重定向跳转或按条件执行相关配置。

Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求,此功能依靠 PCRE(perl compatible regular expression),因此编译之前要安装PCRE库,rewrite是nginx服务器的重要功能之一,用于实现URL的重写,URL的重写是非常有用的功能,比如它可以在我们改变网站结构之后,不需要客户端修改原来的书签,也无需其他网站修改我们的链接,就可以设置为自动访问,另外还可以在一定程度上提高网站的安全性。

2、跳转场景

Rewrite 跳转场景主要包括以下几种

  1. 可以调整用户浏览的 URL,看起来更规范,合乎开发及产品人员的需求
  2. 为了让搜索引擎搜录网站内容及用户体验更好,企业会将动态 URL 地址伪装成静态地址提供服务
  3. 网址换新域名后,让旧的访问跳转到新的域名上。例如,访问京东的 360buy.com会跳转到 jd.com
  4. 根据特殊变量、目录、客户端的信息进行 URL 调整等。

二、标准配置指令

1、rewrite日志记录指令

名称rewrite 日志记录指令
指令rewrite_log
作用域http, server, location
默认值off
指令值选项on 或 off
指令说明当指令值为 on 时,rewrite 的执行结果会以 notice 级别记录到 Nginx 的 error 日志文件中

配置样例如下:

http {
   rewrite_log off;
}

2、未初始化变量告警日志记录指令

名称 未初始化变量告警日志记录指令
指令uninitialized_variable_warn
作用域http, server, location
默认值on
指令值选项on 或 off
指令说明指令值为 on 时,会将未初始化的变量告警记录到日志中

配置样例如下:

http {
    uninitialized_variable_warn off;
}

3、rewrite 指令

通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对URI进行匹配,rewrite主要是针对用户请求的URL或者是URI做具体处理

名称rewrite 指令
指令rewrite
作用域server, location,if
默认值on
指令值选项on 或 off
指令说明对用户的 URI 用正则表达式的方式进行重写,并跳转到新的 URI

配置样例如下:

http {
    rewrite ^/users/(.*)$ /show?user=$1 last;
}

rewrite 访问重写是通过 rewrite 指令实现的,rewrite 指令的语法格式如下:

rewrite regex replacement [flag];

注意:

1) regex 是 PCRE 语法格式的正则表达式。

2) replacement 是重写 URI 的改写规则。当改写规则以"http://""https://"或"$scheme"开头时,Nginx 重写该语句后将停止执行后续任务,并将改写后的 URI 跳转返回客户端。

3) flag 是执行该条重写指令后的操作控制符。操作控制符有如下 4 种:

  • last:执行完当前重写规则跳转到新的 URI 后继续执行后续操作;
  • break:执行完当前重写规则跳转到新的 URI 后不再执行后续操作。不影响用户浏览器 URI 显示;
  • redirect:返回响应状态码 302 的临时重定向,返回内容是重定向 URI 的内容,但浏览器网址仍为请求时的 URI;
  • permanent:返回响应状态码 301 的永久重定向,返回内容是重定向 URI 的内容,浏览器网址变为重定向的 URI。

rewrite将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为表达式指定的新的URI。如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查,隐含有循环机制,但不超过10次;如果超过,提示500响应码,[flag]所表示的标志位用于控制此循环机制如果替换后的URL是以http://或https://开头,则替换结果会直接以重定向返回给客户端, 即永久重定向 301。

3.1 正则表达式

符号功能描述
匹配除换行符以外的任意字符
\w匹配字母或数字或下划线或汉字
\s匹配任意的空白符
\d匹配数字    [0-9]   
\b匹配单词的开始或结束
^匹配字付串的开始
$匹配字符串的结束
*匹配重复零次或更多次
+匹配重复一次或更多次
?匹配重复零次或一次
(n)匹配重复n次
{n,}匹配重复n次或更多次
{n,m}匹配重复n到m次
*?匹配重复任意次,但尽可能少重复
+? 匹配重复1次或更多次,但尽可能少重复
?? 匹配重复0次或1次,但尽可能少重复
{n,m}?匹配重复n到m次,但尽可能少重复
{n,}?匹配重复n次以上,但尽可能少重复
\W匹配任意不是字母,数字,下划线,汉字的字符
\S匹配任意不是空白符的字符
\D匹配任意非数字的字符
\B匹配不是单词开头或结束的位置
[^x]匹配除了x以外的任意字符
[^kgc]匹配除了kgc 这几个字母以外的任意字符

三、rewrite模块使用实例

1.基于域名的跳转

现在公司旧域名www.jiu.com有业务需求变更,需要使用新域名www.xin.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。

第一步:修改主配置文件


vim /usr/local/nginx/conf/nginx.conf
server {
	listen       80;
	server_name  www.jiu.com;										
    #域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.jiu.com-access.log;		        
    #日志修改
	location / {													
    #添加域名重定向
        if ($host = 'www.jiu.com'){									
    #$host为rewrite全局变量,代表请求主机头字段或主机名
			rewrite ^/(.*)$ http://www.xin.com/$1 permanent;		
    #$1为正则匹配的内容,即域名后边的字符串
        }
        root   html;
        index  index.html index.htm;
    }
}

 第二步:创建所需目录与文件 

#创建日志文件夹,检查语法
mkdir -p /var/log/nginx
nginx -t
 
#创建网页test目录与文件1.html
mkdir -p /usr/local/nginx/html/test
vim /usr/local/nginx/html/test/1.html
------------------------------------------
<h1 font color=red>
Here is the content of test
<img src="1.jpg"/>
</h1
-------------------------------------------
 
#上传1.jpg图片文件
cd /usr/local/nginx/html/test
rz -E

 第三步:添加域名与IP地址映射关系

第四步:网页验证 

#打开浏览器输入
www.jiu.com/test/1.html
 
 
会发现重定向到www.xin.com/test/1.html

2.基于客户端 IP 访问跳转

公司业务新版本上线,要求所有 IP 访问任何内容都显示一个固定维护页面,只有公司 IP :192.168.79.210访问正常。

第一步:修改主配置文件

vim /usr/local/nginx/conf/nginx.conf
--------------------------------------------------------------
server {
	listen       80;
	server_name  www.weihu.com;
	#域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.kgc.com-access.log;				#日志修改
 
	#设置是否合法的IP标记
    set $rewrite true;							#设置变量$rewrite,变量值为boole值true
    #判断是否为合法IP
	if ($remote_addr = "192.168.80.111"){		#当客户端IP为192.168.80.111时,将变量值设为false,不进行重写
        set $rewrite false;
    }
	#除了合法IP,其它都是非法IP,进行重写跳转维护页面
    if ($rewrite = true){						#当变量值为true时,进行重写
        rewrite (.+) /weihu.html;				#重写在访问IP后边插入/weihu.html,例如192.168.80.11/weihu.html
    }
    location = /weihu.html {
        root /var/www/html;						#网页返回/var/www/html/weihu.html的内容
    }
	
	location / {
        root   html;
        index  index.html index.htm;
    }
}

第二步:设置维护界面并重启服务

mkdir -p /var/www/html/
vim /var/www/html/weihu.html
-----------------------------------
<h1>
Sorry!
We are busy now!
See you tomorrow!
</h1>
-----------------------------------
 
systemctl restart nginx

 

 第三步:网页验证 

#本机网页浏览器输入
www.weihu.com
访问应正常
 
#在其他设备浏览器访问测试首先修改映射文件
echo "192.168.80.111 www.weihu.com" >>/etc/hosts
 
#浏览器测试
www.weihu.com

 

3. 基于旧域名跳转到新域名后面加目录

现在访问的是 http://mail.jiu.com/post,现在需要将这个域名下面的访问都跳转到http://www.jiu.com/

第一步:修改主配置文件

vim /usr/local/nginx/conf/nginx.conf
-------------------------------------
server {
	listen       80;
	server_name  www.jiu.com;									#域名修改	
	charset utf-8;
	access_log  /var/log/nginx/pc03-access.log;
	#添加
	location /post {
        rewrite (.+) http://www.jiu.com/mail$1 permanent;		#这里的$1为位置变量,代表/post
    }
	
	location / {
        root   html;
        index  index.html index.htm;
    }
}

第二步:添加临时域名和IP的映射关系

vim /etc/hosts
--------------
192.168.80.111 www.jiu.com mail.jiu.com

 第三步:创建准备的网页文件

[root@localhost conf.d]#mkdir -p /apps/nginx/html/post/
[root@localhost conf.d]#echo "this is 1.html" >> /apps/nginx/html/post/1.html
[root@localhost conf.d]#systemctl restart nginx

第四步:浏览器验证

输入mail.jiu.com/post/1.html
显示为www.jiu.com/post/1.html

 

4.基于参数匹配的跳转

访问http://www.jiu.com/100-(100|200)-100.html 跳转到http://www.jiu.com页面。

第一步:修改主配置文件

vim /usr/local/nginx/conf/nginx.conf
--------------------------------------
server {
	listen       80;
	server_name  www.pc04.com;		#域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.pc04.com-access.log;
	
	if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {
        rewrite (.*) http://www.pc04.com permanent;
    }
 
	location / {
        root   html;
        index  index.html index.htm;
    }
}

第二步:检查语法并重启服务

nginx -t
systemctl restart nginx

 第三步:网页验证

#在浏览器输入
www.pc04.com/100-200-100.html

#在浏览器输入错误范围
www.jiu.com/100-500-100.html

5.基于目录下所有 php 结尾的文件跳转

要求访问 http://www.kgc.com/upload/123.php 跳转到首页。

第一步:修改主配置文件

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

第二步:检查语法并重启服务

nginx -t
systemctl restart nginx

第三步:网页验证

#在浏览器输入
www.pc05.com/upload/123.php

6.基于最普通一条 url 请求的跳转

要求访问一个具体的页面如 http://www.kgc.com/abc/123.html 跳转到首页

第一步:修改主配置文件

vim /usr/local/nginx/conf/nginx.conf
----------------------------------------
server {
	listen       80;
	server_name  www.pc06.com;		#域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.pc06.com-access.log  main;
	
    location ~* ^/abc/123.html {
        rewrite (.+) http://www.pc06.com permanent;
    }
 
	location / {
        root   html;
        index  index.html index.htm;
    }
}

第二步:检查配置文件并且重启服务

nginx -t
systemctl restart nginx

第三步:浏览器中访问测试

#在浏览器输入
www.pc06.com/abc/123.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/417551.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Cloud2022之OpenFeign使用以及部分源码分析

OpenFeign使用 Feign和OpenFeign Feign是Netflix开发的⼀个轻量级RESTful的HTTP服务客户端&#xff0c;可以使用⽤它来发起请求&#xff0c;进行远程调用。Fegin是以Java接口注解的⽅式调⽤Http请求&#xff0c;而不是像RestTemplate那样&#xff0c;在Java中通过封装HTTP请求…

【茶话数据结构】查找最短路径——Dijkstra算法详解(保姆式详细图解,步步紧逼,保你学会)

&#x1f4af; 博客内容&#xff1a;【茶话数据结构】查找最短路径——Dijkstra算法详解 &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f989;所属专栏&#xff1a;数据结构笔记 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准前端&#xff0c;专注基础和实…

d3dcompiler_47.dll丢失的解决方法

d3dcompiler_47.dll 是一个属于 Microsoft DirectX 软件组件的动态链接库 (DLL) 文件。DirectX 是微软开发的一套广泛应用于 Windows 操作系统上的应用程序接口 (API)&#xff0c;主要用于处理多媒体、特别是与游戏和高级图形相关的任务&#xff0c;例如二维 (2D) 和三维 (3D) …

Aigtek高精度电流源仪器设计规范

高精度电流源仪器是一种用于产生和测量精确电流的设备&#xff0c;广泛应用于电子、通信、自动控制等领域。为了确保仪器的性能和可靠性&#xff0c;设计过程中需要遵循一些规范。 电流源仪器的设计要注重稳定性。稳定性是保证仪器输出电流精度的关键因素。设计过程中应选择高精…

稀疏图带负边的全源最短路Johnson算法

BellmanFord算法 Johnson算法解决的问题 带负权的稀疏图的全源最短路 算法流程 重新设置的每条边的权重都大于或等于0&#xff0c;跑完Djikstra后得到的全源最短路&#xff0c;记得要还原&#xff0c;即&#xff1a;f(u,v) d(u,v) - h[u] h[v] 例题

vue 解决:点击左侧相同菜单,右侧页面不重新加载的问题

1、问题描述&#xff1a; 其一、需求为&#xff1a; 无论是通过路由组件形成的平台管理系统&#xff0c;还是通过文件配置形成的平台管理系统&#xff0c;都存在通过切换左侧的导航栏而使右侧的页面切换的业务需求&#xff1b; 其二、问题描述为&#xff1a; A、步骤一&#…

【Unity】如何在Unity 中创建带有缩放效果的滚动视图(具有吸附效果的实现与优化)?

效果预览&#xff1a; 目录 效果预览&#xff1a; 一、引言&#xff1a; 二、问题描述 三、解决方案&#xff1a; 三、优化&#xff1a; 四、结论 一、引言&#xff1a; 在Unity开发中&#xff0c;经常需要实现滚动视图&#xff08;ScrollView&#xff09;中的内容吸附到…

印象笔记 - Markdown 入门指南

一、Markdown 是什么&#xff1f; Markdown 是一种轻量级的「标记语言」&#xff0c;创始人为约翰格鲁伯&#xff0c;用简洁的语法代替排版&#xff0c;目前被越来越多的知识工作者、写作爱好者、程序员或研究员广泛使用。其常用的标记符号不超过十个&#xff0c;相对于更为复…

一张图读懂人工智能

一、生成人工智能的概念和应用&#xff0c;以及如何使用大型语言模型进行聊天和创造原创内容。这项技术将会对人类和企业产生深远影响。 计算机获得学习、思考和交流的能力&#xff0c;被称为生成人工智能。生成人工智能可以立即获得人类所有知识的总和&#xff0c;并回答任何…

【Intel oneAPI实战】使用英特尔套件解决杂草-农作物检测分类的视觉问题

目录 一、简介&#xff1a;计算机视觉挑战——检测并清除杂草二、基于YOLO的杂草-农作物检测分类2.1、YOLO简介2.2、基于YOLO的杂草-农作物检测分类解决方案 三、基于YOLO的杂草-农作物检测分类系统设计3.1、基于flask框架的demo应用程序后端3.2、基于Vue框架的demo应用程序前端…

c++中使用lambda表达式的作用和用法

lambda表达式&#xff1a; 这是C11引入的一种新特性&#xff0c;它可以让您在需要定义函数对象的地方&#xff0c;直接编写一个匿名的、可以捕获上下文变量的函数体&#xff0c;非常适合用作回调函数、临时计算或定义小型函数对象。 lambda表达式与普通函数类似&#xff0c;也有…

[MYSQL数据库]--mysql的基础知识

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、数据库…

上门废品回收小程序开发,从传统到线上,到“高收益”

随着我国社会经济不断发展&#xff0c;人们的消费水平能力也在不断提升&#xff0c;日常生活中会产生非常多的废弃物品&#xff0c;为废品回收行业带来了大量的机遇。在回收行业的发展前景下&#xff0c;也为年轻人带来了创业机会&#xff0c;既获得利润&#xff0c;也能为社会…

六、OpenAI之嵌入式(Embedding)

嵌入模式 学习怎么将文本转换成数字&#xff0c;解锁搜索等案例。 新的嵌入模型 text-embedding-3-small 和 text-embedding-3-large&#xff0c;是目前最新的并且性能最好的嵌入模型&#xff0c;成本低&#xff0c;支持多语言&#xff0c;拥有控制所有大小的新参数 1. 什么是…

周鸿祎免费课演示AI新品,瞬时流量暴增现场增加服务器

2月29日&#xff0c;360创始人周鸿祎首堂AI免费课开讲&#xff0c;吸引千万网友围观。演讲现场周鸿祎演示了两款AI驱动的新产品。在演示测试版360AI搜索时&#xff0c;由于用户体验火爆&#xff0c;瞬时流量暴增44倍&#xff0c;为满足用户和全网用户需求临时增加了服务器。产品…

solidity编程

一.Solidity 简介 Solidity 是⼀种⽤于编写以太坊虚拟机&#xff08; EVM &#xff09;智能合约的 编程语⾔。我认为掌握 Solidity 是参与链上项⽬的必备技 能&#xff1a;区块链项⽬⼤部分是开源的&#xff0c;如果你能读懂代码&#xff0c;就可以 规避很多亏钱项⽬。…

LeetCode 2265.统计值等于子树平均值的节点数

给你一棵二叉树的根节点 root &#xff0c;找出并返回满足要求的节点数&#xff0c;要求节点的值等于其 子树 中值的 平均值 。 注意&#xff1a; n 个元素的平均值可以由 n 个元素 求和 然后再除以 n &#xff0c;并 向下舍入 到最近的整数。 root 的 子树 由 root 和它的所…

大模型量化技术原理-ZeroQuant系列

近年来&#xff0c;随着Transformer、MOE架构的提出&#xff0c;使得深度学习模型轻松突破上万亿规模参数&#xff0c;从而导致模型变得越来越大&#xff0c;因此&#xff0c;我们需要一些大模型压缩技术来降低模型部署的成本&#xff0c;并提升模型的推理性能。 模型压缩主要分…

什么是VR紧急情况模拟|消防应急虚拟展馆|VR游戏体验馆加盟

VR紧急情况模拟是利用虚拟现实&#xff08;Virtual Reality&#xff0c;简称VR&#xff09;技术来模拟各种紧急情况和应急场景的训练和演练。通过VR技术&#xff0c;用户可以身临其境地体验各种紧急情况&#xff0c;如火灾、地震、交通事故等&#xff0c;以及应对这些紧急情况的…

IM(即时通讯-聊天工具):一文读懂,技术栈和界面设计。

大家好&#xff0c;我是贝格前端工场&#xff0c;本期继续分享IM&#xff08;即时通讯&#xff09;的设计&#xff0c;欢迎大家关注&#xff0c;如有B端写系统界面的设计和前端需求&#xff0c;可以联络我们。 一、什么是IM&#xff08;聊天工具) IM即时通讯工具是指一类用于…