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]

匹配单词的开始或结束

^

匹配字付串的开始

$

匹配字符串的结束

*

匹配重复零次或更多次

匹配重复一次或更多次

匹配重复零次或一次

(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#判断是否为合法IPif ($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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mybatis(一)

配置文件 必要的用户密码要修改, 还有绿色线的名字要修改成数据库的 配置文件直接cv 创建 复习之前的知识进行分层处理 与前面一一对应, 后面三个发现后面输出是null, 没有一一对应, 后面再解释解决方法 运行发现, 输出正常 idea的测试类 两个注解了解 记得加上这个, 不然无…

一周学会Flask3 Python Web开发-http响应状态码

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 在Flask程序中&#xff0c;客户端发出的请求触发相应的视图函数&#xff0c;获取返回值会作为响应的主体&#xff0c;最后生成…

七星棋牌源码高阶技术指南:6端互通、200+子游戏玩法深度剖析与企业级搭建实战(完全开源)

在棋牌游戏行业高速发展的今天&#xff0c;如何构建一个具备高并发、强稳定性与多功能支持的棋牌游戏系统成为众多开发者和运营团队关注的焦点。七星棋牌全开源修复版源码 凭借其 六端互通、200子游戏玩法、多省区本地化支持&#xff0c;以及 乐豆系统、防沉迷、比赛场、AI智能…

C++和OpenGL实现3D游戏编程【总览】

欢迎来到zhooyu的游戏专栏。 主页网址&#xff1a;【zhooyu】 专栏网址&#xff1a;【C和OpenGL实现3D游戏编程】 &#x1f31f;&#x1f31f;&#x1f31f;这里将通过一个OpenGL实现3D游戏编程实例教程&#xff0c;带大家深入学习OpenGL知识。知识无穷而人力有穷&#xff0c;…

pycharm社区版有个window和arm64版本,到底下载哪一个?还有pycharm官网

首先pycharm官网是这一个。我是在2025年2月16日9:57进入的网站。如果网站还没有更新的话&#xff0c;那么就往下滑一下找到 community Edition,这个就是社区版了免费的。PyCharm&#xff1a;适用于数据科学和 Web 开发的 Python IDE 适用于数据科学和 Web 开发的 Python IDE&am…

GPT-Sovits:语音克隆训练-遇坑解决

前言 本来以为3050完全无法执行GPT-Sovits训练的&#xff0c;但经过实践发现其实是可以&#xff0c;并且仅花费了十数分钟便成功训练和推理验证了自己的语音模型。 官方笔记&#xff1a;GPT-SoVITS指南 语雀 项目地址&#xff1a;https://github.com/RVC-Boss/GPT-SoVITS 本人…

8 SpringBootWeb案例(上): 查询【分页功能(分页插件)】、删除、新增、修改

文章目录 前言:SpringBootWeb案例1. 准备工作1.1 需求&环境搭建1.1.1 需求说明1.1.2 环境搭建1.2 开发规范1.2.1 开发规范-REST(不强求非要这种风格,传统风格有时候更方便)1.2.2 开发规范-统一响应结果和异常处理1.2.3 开发流程2. 部门管理2.1 查询部门2.1.1 原型和需求…

深入了解 DevOps 基础架构:可追溯性的关键作用

在当今竞争激烈的软件环境中&#xff0c;快速交付强大的应用程序至关重要。尽管如此&#xff0c;在不影响质量的情况下保持速度可能是一项艰巨的任务&#xff0c;这就是 DevOps 中的可追溯性发挥作用的地方。通过提供软件开发生命周期 &#xff08;SDLC&#xff09; 的透明视图…

用C++ Qt实现安卓电池充电动效 | 打造工业级电量控件

一、为什么需要自定义电池控件&#xff1f; 在工业控制、车机系统、智能硬件等领域的UI开发中&#xff0c;电池状态显示是高频出现的UI组件。通过实现一个支持颜色渐变、动态充电动画、警戒阈值提示的电池控件&#xff0c;开发者可以系统掌握以下核心能力&#xff1a; Qt绘图…

一批起飞猪名单配图

好久没有使用风口猪选股指标了&#xff0c;今天去玩了一把&#xff0c;发现起飞猪指标显示了好多一批猪票 华曙高科 汉威科技 双林股份 曼恩斯特 长盈精密 江苏雷利 双飞集团 奥飞数据 硅宝科技 水晶光电 长盈精密

机器学习笔记——常用损失函数

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本笔记介绍机器学习中常见的损失函数和代价函数&#xff0c;各函数的使用场景。 热门专栏 机器学习 机器学习笔记合集 深度学习 深度学习笔记合集 文章目录 热门…

Ubuntu 服务器Llama Factory 搭建DeepSeek-R1微调训练环境

1.首先了解一下什么是LLM微调 LLM 微调指的是在已经预训练好的大型语言模型基础上&#xff0c;使用特定的任务数据或领域数据&#xff0c;通过进一步的训练来调整模型的参数&#xff0c;使其在特定任务或领域上能够表现得更好。简单来说&#xff0c;就是对一个已经具备了丰富语…

环境变量与本地变量

目录 本地变量的创建 环境变量VS本地变量 认识完了环境变量我们来认识一下本地变量。 本地变量的创建 我们如果直接env是看不到本地变量的&#xff0c;因为本地变量和环境变量都具有独立性&#xff0c;环境变量是系统提供的具有全局属性的变量&#xff0c;都存在bash进程的…

智慧农业新生态 | 农业数字化服务平台——让土地生金,让服务无忧

一部手机管农事&#xff0c;从播种到丰收&#xff0c;全链路数字化赋能&#xff01; 面向农户、农机手、农服商、农资商打造的一站式农业产业互联网平台&#xff0c;打通农资交易、农机调度、农服管理、技术指导全场景闭环&#xff0c;助力乡村振兴提效增收。 三大核心场景&am…

【运维自动化-作业平台】如何创建执行方案和作业模板

蓝鲸智云作业平台&#xff0c;以下简称作业平台或JOB平台作业模板和执行方案&#xff1a;将运维操作场景中涉及到的多个脚本执行或文件分发步骤组合成一个作业模板&#xff0c;这个作业模板尽可能把场景相关的共性逻辑都包含进去&#xff0c;然后再根据实际使用场景衍生出相应的…

广度优先搜索--之重生之我是蒟蒻,从入坟到入坑式讲解

广度优先搜索 1.什么是广度优先搜索? 广度优先搜索&#xff08;Breadth-First Search&#xff0c;简称BFS&#xff09;是一种遍历或搜索树和图的算法&#xff0c;也称为宽度优先搜索&#xff0c;BFS算法从图的某个节点开始&#xff0c;依次对其所有相邻节点进行探索和遍历&am…

CSDN文章质量分查询系统【赠python爬虫、提分攻略】

CSDN文章质量分查询系统 https://www.csdn.net/qc 点击链接-----> CSDN文章质量分查询系统 <------点击链接 点击链接-----> https://www.csdn.net/qc <------点击链接 点击链接-----> CSDN文章质量分查询系统 <------点击链接 点击链…

为AI聊天工具添加一个知识系统 之113 详细设计之54 Chance:偶然和适配 之2

本文要点 要点 祖传代码中的”槽“ &#xff08;占位符变量&#xff09; 和 它在实操中的三种槽&#xff08;占据槽&#xff0c;请求槽和填充槽&#xff0c; 实时数据库&#xff08;source&#xff09;中数据(流入 ETL的一个正序流程 行列并发 靶向整形 绑定变量 &#xff09…

微信小程序实现拉卡拉支付

功能需求&#xff1a;拉卡拉支付&#xff08;通过跳转拉卡拉平台进行支付&#xff09;&#xff0c;他人支付&#xff08;通过链接进行平台跳转支付&#xff09; 1.支付操作 //支付 const onCanStartPay async (obj) > {uni.showLoading({mask: true})// 支付接口获取需要传…

Spring框架基本使用(Maven详解)

前言&#xff1a; 当我们创建项目的时候&#xff0c;第一步少不了搭建环境的相关准备工作。 那么如果想让我们的项目做起来方便快捷&#xff0c;应该引入更多的管理工具&#xff0c;帮我们管理。 Maven的出现帮我们大大解决了管理的难题&#xff01;&#xff01; Maven&#xf…