Nginx之rewrite实现URL重写

news/2024/5/17 11:28:24/文章来源:https://blog.csdn.net/weixin_43834401/article/details/130643053

1.开篇

rewrite是nginx服务器提供的一个重要功能,用于实现URL的重写。例如我们访问https://aa.qq.com,打开的是https://age.qq.com/,这就是使用URL重写的特性来实现的。

ngx_http_rewrite_module为实现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用于获取请求中的参数。例如: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用于获取客户端请求使用的协议,例如http、https等
$server_addr用于获取服务端的IP地址
$server_name用于获取虚拟主机的名称
$server_port用于获取虚拟主机的监听的端口
$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>;
}

发起请求:http://192.168.110.98/test?name=tom

2.2 if指令

作用域:server, location

语法:if (condition) { … }

如果条件表达式为true,则执行该模块大括号中的指令。

🔔Tips:if(之间有一个空格。

条件表达式有几种形式:

1)变量名,如果变量的值为空字符串或"0",则为false,其他条件为true。

if ($variable){}

2)使用"=“和”!="比较变量和字符串是否相等,满足条件则为true,否则为false。

if ($request_method = POST){}

3)使用正则表达式与变量的值进行匹配。变量与正则表达式之间使用~~*!~!~*,如果正则表达式包含};,则整个表达式应该用单引号或双引号括起来。

  • ~:表示匹配正则表达式,区分大小写
  • ~*:表示匹配正则表达式,不区分大小写
  • !~:表示匹配正则表达式,区分大小写,并对匹配后的结果取反
  • !~*:表示匹配正则表达式,不区分大小写,并对匹配后的结果取反
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;
}

我们已经在html目录下准备了一个test.html。

访问http://192.168.110.98/test.html,可以正常显示。

访问http://192.168.110.98/test,因为文件不存在,所以执行if条件块的指令。

5)判断目录是否存在:-d!-d

6)判断文件、目录或符号链接是否存在:-e!-e

7)判断文件是否可以执行:-x!-x

2.3 break指令

作用域:server, location, if;

语法:break;

在同一作用域中,中断该指令之后的其他指令,位于其前面的指令配置生效,位于其后面的指令配置则无效。

示例:如果URL中存在参数,则执行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,指令都正常执行。

访问http://192.168.110.98/testBreak?name=zhangsan,说明执行了if逻辑。

break;语句的定义来说,在其执行后,其作用域外后面的指令应该正常执行才对,但是这里直接返回了404。这个时候,就需要我们查看error.log

在这里插入图片描述

可以发现,错误提示为文件未找到,根据错误提示,我们需要在html目录下创建一个testBreak目录,然后在testBreak目录下创建一个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语句执行后,其作用域外后面的指令正常执行。

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指令

在了解setifbreakreturn指令后,重头戏rewrite指令登场。

作用域:server, location, if;

语法:rewrite regex replacement [flag];

regex:用来匹配URI的正则表达式。

replacement:正则匹配成功后,用来替换URI的字符串。如果该字符串以http://https://$scheme开头,则处理将停止,并重定向URI到客户端。

flag:是一个可选参数,其有4个候选值。

flag值说明
last停止处理rewrite指令,并使用重写的URI去与各个location进行匹配
break停止处理rewrite指令,与break;效果一致
redirect如果replacement字符串不是以http://https://$scheme开头,则重定向到重写的URI,响应码为302
permanent重定向到重写的URI,响应码为301

rewrite指令通过正则表达式匹配URI,并修改URI。可同时存在多个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指令的处理结果以notice级别的日志写入到error_log中。

示例:

location /rewrite {# 开启rewrite_logrewrite_log on;# 配置error_logerror_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 域名重定向

**场景:**公司官网上线的时候地址为www.aaa.com,随着公司的不断发展,需要将官网地址升级为www.bbb.com,但是需要在访问www.aaa.com能够自动跳转到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 优雅处理防盗链

前面我们在【Nginx静态资源防盗链】一文中已经简单的实现了静态资源的防盗链,但是展示在页面的是一个裂开的小图片,不够美观。

我们可以如下配置:

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

如果出现盗链的情况,将会出现类似于如下效果:

以上就是Nginx之rewrite实现URL重写,Nginx是多模块化的,还有很多高级功能,我们后面继续探索。

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

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

相关文章

亚马逊云科技发力医疗与生命科学行业,加速数字化创新

2023年4月27日&#xff0c;亚马逊云科技医疗与生命科学行业峰会召开&#xff0c;会议汇聚了业界专家和思想领袖&#xff0c;共同探讨行业数字化转型和创新之道。作为全球医疗及生命科学行业云计算引领者&#xff0c;亚马逊云科技将围绕数据、算力和行业用户体验三大需求发力&am…

简历制作、投递、(实习)面试技巧!!

目录 1.为什么要找实习 2.什么时候找实习 3.制作简历 4.简历注意事项 5.IT后端的校招的要求 6.简历里面写什么&#xff1f; 7.简历模板的选择 8.个人信息 9.求职意向 10.专业技能 11.项目经验 12.其他注意事项 13.找工作的手段 14.找工作的态度 ​编辑 15.面试…

C++智能指针的原理、分类、使用

1. 智能指针介绍 为解决裸指针可能导致的内存泄漏问题。如&#xff1a; a&#xff09;忘记释放内存&#xff1b; b&#xff09;程序提前退出导致资源释放代码未执行到。 就出现了智能指针&#xff0c;能够做到资源的自动释放。 2. 智能指针的原理和简单实现 2.1 智能指针的原…

MySQL笔记(四) 函数、变量、存储过程、游标、索引、存储引擎、数据库维护、指定字符集、锁机制

MySQL笔记&#xff08;四&#xff09; 文章目录 MySQL笔记&#xff08;四&#xff09;函数文本处理函数日期和时间处理函数数值处理函数类型转换函数流程控制函数自定义函数基本语法 局部变量全局变量聚集函数 aggregate functionDISTINCT 存储过程为什么要使用使用创建 删除建…

Rust Wasm Linux开发环境搭建

一、Linux 镜像版本 CentOS-7-x86_64-DVD-2009.iso&#xff0c;Virtual Box 7.0 选择 GNOME Desktop 版本&#xff0c; 配置远程连接&#xff08;可选&#xff09;&#xff0c; nmtui 激活连接 enp0s3 &#xff0c;查看 ip 地址&#xff0c; 绑定端口转发&#xff0c; 通过…

JQuery 详细教程

文章目录 一、JQuery 对象1.1 安装和使用1.2 JQuery包装集对象 二、JQuery 选择器2.1 基础选择器2.2 层次选择器2.3 表单选择器 三、JQuery Dom 操作3.1 操作元素3.1.1 操作属性3.1.2 操作样式3.1.3 操作内容 3.2 添加元素3.3 删除元素3.4 遍历元素 四、JQuery 事件4.1 ready 加…

PBR核心理论与渲染原理

基于物理的渲染&#xff08;Physically Based Rendering&#xff0c;PBR&#xff09;是指使用基于物理原理和微平面理论建模的着色/光照模型&#xff0c;以及使用从现实中测量的表面参数来准确表示真实世界材质的渲染理念。 以下是对PBR基础理念的概括&#xff1a; 微平面理论…

Android View 事件分发机制,看这一篇就够了

在 Android 开发当中&#xff0c;View 的事件分发机制是一块很重要的知识。不仅在开发当中经常需要用到&#xff0c;面试的时候也经常被问到。 如果你在面试的时候&#xff0c;能把这块讲清楚&#xff0c;对于校招生或者实习生来说&#xff0c;算是一块不错的加分项。对于工作…

对STM32栈的理解Stack_Size EQU 0x00000400

对STM32栈的理解Stack_Size EQU 0x00000400 Stack_Size EQU 0x00000400表示什么意思可以通过查找flash内存的方式定位存储1.flash2.RAM内部 本人主要为个人参考网络及个人总结而来比较&#xff0c;如有雷同请告知&#xff0c;即刻删除 以下引用网上资料 理解堆和栈的区别 &…

PFCdocumentation_FISH Rules and Usage

目录 FISH Scripting FISH Rules and Usage Lines Data Types Reserved Names for Functions and Variables Scope of Variables Functions: Structure, Evaluation, and Calling Scheme Arithmetic: Expressions and Type Conversions Redefining FISH Functions Ex…

中断相关内容大全

中断基本概念&#xff1a;程序中断指计算机执行现行程序过程中&#xff0c;出现某种急需处理的异常情况或特殊请求&#xff0c;CPU暂时中止现行程序&#xff0c;而转去对这些异常情况或特殊请求进行处理&#xff0c;处理完毕后CPU又自动返回到现行程序的断点处&#xff0c;继续…

算法修炼之练气篇——练气十七层

博主&#xff1a;命运之光 专栏&#xff1a;算法修炼之练气篇 前言&#xff1a;每天练习五道题&#xff0c;炼气篇大概会练习200道题左右&#xff0c;题目有C语言网上的题&#xff0c;也有洛谷上面的题&#xff0c;题目简单适合新手入门。&#xff08;代码都是命运之光自己写的…

【最新可用】chatGPT镜像网站国内使用,免费稳定!

新建了一个网站 https://ai.weoknow.com/ 每天给大家更新可用的国内可用chatGPT 2023.5.8新增一个 ChatGPT 国内免翻版 【网站名称】&#xff1a;Chat GPT Ai 【使用环境】&#xff1a;移动端/电脑网页端 ChatGPT是一款功能强大的免费在线聊天机器人&#xff0c;具有人工智能…

JavaScript通过js的方式来计算平行四边形的面积的代码

以下为通过js的方式来计算平行四边形的程序代码和运行截图 目录 前言 一、通过js的方式来计算平行四边形&#xff08;html部分&#xff09; 1.1 运行流程及思想 1.2 代码段 二、通过js的方式来计算平行四边形&#xff08;js部分&#xff09; 2.1 运行流程及思想 2.2 代码…

C#中如何使用ObjectPool来提高StringBuilder的性能

在C#中我们知道使用StringBuilder能提高大量字符串拼接的效率&#xff0c;其实StringBuilder的效率也可以提升&#xff0c;那就是使用ObjectPool。以下介绍怎么使用ObjectPool提高StringBuilder的性能。一、简介 C# ObjectPool类是一个内置的类库&#xff0c;用于实现对象…

AFG1062任意波形/函数发生器 产品资料

AFG1000 任意波形/函数发生器&#xff0c;提供 25MHz 或 60MHz 带宽&#xff0c;2 个输出通道&#xff0c;在整个带宽内 1mVpp 到 10Vpp 输出振幅&#xff0c;泰克 AFG1000 任意波形/函数发生器可以生成各种实验室测试所需波形。 *重要的是&#xff0c;它在泰克任意函数发生器系…

基于知识图谱的个性化学习资源推荐系统的设计与实现(论文+源码)_kaic

摘 要 最近几年来&#xff0c;伴随着教育信息化、个性化教育和K12之类的新观念提出,一如既往的教育方法向信息化智能化的转变&#xff0c;学生群体都对这种不受时间和地点约束的学习方式有浓厚的兴趣。而现在市面上存在的推荐系统给学生推荐资料时不符合学生个人对知识获取的…

小曾同学【五周年创作纪念日】——努力向前冲的菜鸟

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c; 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。&#x1f60a; 座右铭&#xff1a;不想当开发的测试&#xff0c;不是一个好…

自主可控不走捷径,中国长城做难且正确的事

2020-2022年是中国信创产业的重要推广期&#xff0c;在国家战略的支持下&#xff0c;自主可控领域诸多相关企业均获得绝佳发展良机。 但信创产业“完成替代”不是终点&#xff0c;“实现领先”方是目标。如今势已启、路尚远&#xff0c;前景广阔的市场并不意味着自主可控相关企…

Hadoop之block切片

切片是一个逻辑概念 在不改变现在数据存储的情况下&#xff0c;可以控制参与计算的节点数目 通过切片大小可以达到控制计算节点数量的目的 有多少个切片就会执行多少个Map任务 hdfs上数据存储的一个单元,同一个文件中块的大小都是相同的 因为数据存储到HDFS上不可变&#xff0…