Nginx之rewrite重写功能

一、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

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

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

相关文章

idea 创建打包 android App

1、使用 idea 创建 android 工程 2、 配置构建 sdk 3、配置 gradle a、进入 gradle 官网&#xff0c;选择 install &#xff08;默认是最新版本&#xff09; b、选择包管理安装&#xff0c;手动安装选择下面一个即可 c、安装 sdk 并通过 sdk 安装 gradle 安装 sdk&#xff1a…

软件无线电SDR加人工智能算法实现无人机频谱探测

通用软件无线电接收机作为传感器实时接收探测无线电信号&#xff0c;加上深度学习算法实现频谱识别&#xff0c;(https://img-blog.csdnimg.cn/5a6c4d89a047453a94f763f4e67aeb17.png)

合并果子(哈夫曼树)NOIP2004提高组

在一个果园里&#xff0c;达达已经将所有的果子打了下来&#xff0c;而且按果子的不同种类分成了不同的堆。 达达决定把所有的果子合成一堆。 每一次合并&#xff0c;达达可以把两堆果子合并到一起&#xff0c;消耗的体力等于两堆果子的重量之和。 可以看出&#xff0c;所有…

大话设计模式——3.建造者模式(Builder Pattern)

1.定义&#xff1a; 将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。UML图 2.示例&#xff1a; 汽车或者电脑的组装可以采用构造者模式进行设计&#xff0c;如汽车的引擎或者轮胎&#xff0c;电脑的处理器、内存、主板等都可以进行…

flutter简单的MethodChannel通道Demo(引入调用小红书sdk)

flutter端创建MethodChannel类 import package:flutter/services.dart;//MethodChannel const methodChannel const MethodChannel(com.flutter.demo.MethodChannel);class FlutterMethodChannel {/** MethodChannel flutter给原生发信息* 在方法通道上调用方法invokeMethod*…

[开源协议] 什么是MIT协议及其使用场景

什么是MIT协议? MIT协议是一种开放源代码软件授权协议&#xff0c;全称为Massachusetts Institute of Technology License。该协议允许自由地使用、复制、修改、合并、发布、分发、再授权和销售软件及其副本的任何部分。MIT协议要求在软件的所有副本中包含版权声明和许可声明…

高性能API云原生网关 APISIX安装与配置指南

Apache APISIX是Apache软件基金会下的顶级项目&#xff0c;由API7.ai开发并捐赠。它是一个高性能的云原生API网关&#xff0c;具有动态、实时等特点。 APISIX网关可作为所有业务的流量入口&#xff0c;为用户提供了丰富的功能&#xff0c;包括动态路由、动态上游、动态证书、A…

瀑布型还是敏捷型?一次搞懂主数据项目实施方法

在主数据项目实施的过程中&#xff0c;经常会碰到一个让人头痛的问题&#xff0c;我该选择什么样的实施方法才能够更为高效地完成项目的交付&#xff1f; 得帆经过多年在软件行业的摸爬滚打&#xff0c;总结出了适合主数据项目的实施方法。接下来我们将为大家介绍两种常用的实…

gitlab添加ssh公钥

一&#xff1a;生成公钥 桌面鼠标右击打开 Open Git Bash here (前提是安装了Git)&#xff1b; 2.输入命令 ssh-keygen -t rsa -C "123*****90qq.com"来生成新的密钥对,将其中的"123*****90qq.com"替换为你自己的电子邮件地址。 命令&#xff1a;ssh-keyg…

提升Vue3应用效率的秘诀:深入比较ref与reactive!

ref 和 reactive 是 Vue3 中实现响应式数据的核心 API。ref 用于包装基本数据类型&#xff0c;而 reactive 用于处理对象和数组。尽管 reactive 似乎更适合处理对象&#xff0c;但 Vue3 官方文档更推荐使用 ref。 我的想法&#xff0c;ref就是比reactive好用&#xff0c;官方也…

Vue:vue的安装与环境的搭建

文章目录 环境搭建安装node.js&#xff08;比较简单&#xff09;安装Vue脚手架初始化启动 环境搭建 安装node.js&#xff08;比较简单&#xff09; 首先要安装node.js&#xff0c;进入官网下载即可。 更改安装路径&#xff0c;保持默认配置&#xff0c;一直点击下一步安装即可…

(undone) 如何计算 Hessian Matrix 海森矩阵 海塞矩阵

参考视频1&#xff1a;https://www.bilibili.com/video/BV1H64y1T7zQ/?spm_id_from333.337.search-card.all.click 参考视频2&#xff08;正定矩阵&#xff09;&#xff1a;https://www.bilibili.com/video/BV1Ag411M76G/?spm_id_from333.337.search-card.all.click&vd_…

如何电脑录屏?教你3分钟快速掌握!

在当今数字化时代&#xff0c;电脑录屏已成为一项必不可少的技能。无论是录制游戏画面、线上课程还是软件演示&#xff0c;录屏都可以帮助用户更好地保存和分享信息。可是如何电脑录屏呢&#xff1f;在本文中&#xff0c;我们将介绍两种常用的电脑录屏方法&#xff0c;并分步骤…

【nvm切换node版本,发现npm无法使用,简单粗暴的解决方案】

nvm切换node版本&#xff0c;发现npm无法使用&#xff0c;简单粗暴的解决方案 使用了nvm切换指定node版本后&#xff0c;发现npm命令无法使用。 在nodejs官网找到这部分内容 找到需要安装的压缩包 把解压的文件放入到自己的nvm文件夹内 这部分是解压的nodejs 示例

HarmonyOS—低代码开发Demo示例

接下来为大家展示一个低代码开发的JS工程的Demo示例&#xff0c;使用低代码开发如下华为手机介绍列表的HarmonyOS应用/服务示例。 1.删除模板页面中的控件后&#xff0c;选中组件栏中的List组件&#xff0c;将其拖至中央画布区域&#xff0c;松开鼠标&#xff0c;实现一个List组…

Langchain-Chatchat:离线运行的大模型知识库 | 开源日报 No.182

chatchat-space/Langchain-Chatchat Stars: 22k License: Apache-2.0 基于 ChatGLM 等大语言模型与 Langchain 等应用框架实现的开源、可离线部署的检索增强生成 (RAG) 大模型知识库项目。该项目是一个可以实现完全本地化推理的知识库增强方案&#xff0c;重点解决数据安全保护…

智慧园区可视化的价值,不要再吐槽没啥用了。

2023-04-20 13:30贝格前端工场 提高园区运营效率&#xff1a;智慧园区可以通过物联网技术、大数据分析等手段&#xff0c;实现对园区内设施、设备、人员等的实时监控和管理&#xff0c;从而提高园区的运营效率&#xff0c;降低管理成本。 提升园区服务水平&#xff1a;智慧园区…

前端Vue项目无法启动服务,提示无 ‘dev‘ npm的脚本问题解决

目录 一、问题详情 二、问题解决 一、问题详情 上周还能运行的项目&#xff0c;今天突然无法执行了&#xff0c;连最基本的启动按钮也没有了&#xff0c;所有的项目本地都突然跑不起来了&#xff0c;附上截图。 二、问题解决 后来排查的根本原因有点奇葩&#xff0c;是因为…

ABBYY FineReader16文档转换、PDF管理与文档比较功能介绍

ABBYY FineReader 16作为一款OCR和PDF一体化程序&#xff0c;其强大的功能使得文档处理变得简单高效。在众多功能中&#xff0c;文档转换、PDF管理和文档比较这三大功能尤为突出&#xff0c;成为了众多企业和个人用户的首选工具。 ABBYY Finereader 16-安装包下载如下&#xff…

内存函数(C语言进阶)

目录 前言 1、memcpy 2、memmove 3、memcmp 4、memset 结语 前言 本篇介绍了C语言中的内存函数&#xff0c;内存函数&#xff0c;顾名思义就是处理内存的函数。 1、memcpy memcpy&#xff1a;内存拷贝函数。 相对于strcpy只能拷贝字符串来讲&#xff0c;memcpy能拷…