nginx rewrite重写

Nginx 的 rewrite 指令可以用来修改 URI的请求。通过 rewrite,你可以重定向 URL 请求、修改 URL 参数、或者根据特定条件进行URL跳转 等操作。Nginx 重写规则用于更改客户端请求的全部或部分URL。更改URL的主要目的是通知客户端他们正在查找的资源已经更改了位置。Nginx 中的return和rewrite指令是用来重写URL的。

url重写可以使用rewrite、return、if、break、set几个指令来完成

重写语法

rewrite指令可以出现在server、location和if块里。

语法:

rewrite regex replacement [flag]

regex:用来匹配客户端请求url地址

replacement:如果请求地址匹配regex表达式,则会被重写成replacement地址

flag:决定是否需要对重写指令进行更多的处理。取值有4个

  • last:停止处理当前重写指令,Nginx 将会停止当前 server 块内的 rewrite 指令处理,并根据重写后的 URI 重新匹配 location。last 标志通常用于结束当前的 rewrite 处理,并将控制权交给下一个 location。默认值是last。

  • break:使用 break 标志表示停止执行当前 server 块内的 rewrite 指令,并立即将处理流程返回到 Nginx 的核心模块,跳过后续的 rewrite 或其他指令。break 可以用于防止无限循环重定向或在特定条件下提前结束重写处理。

  • redirect:返回一个临时重定向302,一般内部重定向,不是以http://或https://协议开头

  • permanent:permanent是永久的意思,使用 permanent 标志会发送 301 永久重定向响应给客户端,告诉客户端请求的资源永久移动到了新的位置。客户端会缓存这个重定向,下次访问时会直接跳转到新的地址。

例子

location / {rewrite ^/(.*)$ https://www.baidu.com/s?wd=$1 permanent;
}

请求的路径会作为关键词跳转到百度进行搜索,浏览器会返回301重定向。

正则中^和$表示匹配路径的开始和结束。 (.*)表示匹配所有,后面跳转使用的

$1表示正则匹配的第一个group。也就是 (.*)内容,多个组使用 \ $1、$2这种依次按顺序取值

location /redirect {rewrite ^/redirect(.*)$ /redirect?id=$1;
}

上面的访问/redirect/1 会重定向到 /redirect?id=1。没有指定flag,默认为last。重写后的url会继续进行location匹配还是进入当前location,这样造成了无限循环重定向。所以这里应该指定flag为break。

    location /aa {rewrite ^/aa/(.*)$ /bb/$1 redirect;rewrite ^.*$ /cc redirect;}

上面的/aa请求会被重定向到/bb请求。302临时重定向,客户端url地址会变。

条件重写

rewrite重写可以结合if命令进行条件判断

if语法

if (condition) { ... }

可以使用在server和location块。

condition判断可以使用nginx中内置的变量。

可以使用 = 或 !=号来进行等值判断。

可以使用~进行正则匹配,~大小写敏感,~*大小写不敏感。也可以使用!~进行取反。

if处理对值进行匹配还可以进行文件或目录的判断

-f或 !-f来判断文件存不存在

-d或 !-d来判断文件目录是否存在

-e或!-e来判断文件或目录是否存在

常用的内置变量:

$scheme:请求的协议,如 http 或 https

$remote_addr:客户端的 IP 地址

$args:请求中的参数部分

$request_method:HTTP 请求方法,如 GET、POST 等

$http_user_agent:客户端的 User-Agent 字段

$request_uri:包含请求参数的原始 URI

$request_filename:当前请求的文件路径。

$http_referer:客户端的 Referer 头字段

$status:响应的状态码

更多变量可以查看nginx官网:Alphabetical index of variables (nginx.org)

例子:

判断是否是ie浏览器

if ($http_user_agent ~ MSIE) {rewrite ^(.*)$ /msie/$1 break;
}

禁止GET请求

if ($request_method = GET) {return 403;
}

禁止某个IP访问

if  ($remote_addr = 192.168.1.111) {return 403;
}

判断请求host进行跳转

if ($http_host = test.com) {rewrite  (.*)  https://www.test.com$1;
}

判断请求文件存在

 if (!-e $request_filename) {rewrite ^(.*)$ /index.php?s=$1 last;break;}

另外在if中还可以使用set命令来设置变量

set $variable value;

如:

if ($args ~ "^id=(.*)&lang=(.*)") {set $id $1;set $lang $2;rewrite ^/page.php$ /page/$lang/$id? permanent;
}

从请求参数$args中提取参数值,然后rewrite到后续的页面。

set命令不仅可以在if块中使用,也可以在server和location块中来定义变量。

return语句

return语句已经多次使用,语法如下

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

这里不在多说了。

rewrite支持记录重定向日志记录

rewrite_log on;
error_log /var/log/nginx/error.log notice;

配置rewrite_log on开启rewrite log。rewrite log会以notice类型记录在error日志中。

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

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

相关文章

如何使用 ArcGIS Pro 制作好看的高程渲染图

虽然 ArcGIS Pro 已经提供了很多好看的配色方案,但是如果直接对高程DEM进行渲染效果不是很理想,我们可以结合山体阴影让高程渲染图看起来更加立体,这里为大家介绍一下制作方法,希望能对你有所帮助。 数据来源 教程所使用的数据是…

使用egg.js发送jwt

下载jwt 配置jwt pnpm i egg-jwt plugin.js /** type Egg.EggPlugin */ module.exports {jwt:{enable:true,package:egg-jwt} }; config.default.js config.jwt {secret:"hakurei77" //密钥} 创建中间层 app -> middleware //检查token module.…

component-右侧抽屉组件

1.右侧抽屉组件 点击筛选&#xff0c;右侧抽屉滑出&#xff0c;点击取消或者点击空白处抽屉收起。 2.代码 <template><div class"all" click"hidden()"><!-- 抽屉 --><div class"drawer"><div class"drawerBo…

Android StateLayout状态页

文章目录 Android StateLayout状态页概述源码使用源码下载 Android StateLayout状态页 概述 StateLayout&#xff08;状态页&#xff09;包含&#xff1a;加载中页面&#xff0c;错误页面&#xff0c;空页面&#xff0c;内含状态默认页面&#xff0c;支持自定义页面。 源码 …

Python XML 解析

在Python中&#xff0c;解析XML文档通常使用ElementTree模块。ElementTree提供了一种简单的方式来解析和操作XML数据。下面通过一个案例来说明如何使用Python的ElementTree来解析XML文档&#xff1a; 假设有一个名为books.xml的XML文件&#xff0c;内容如下&#xff1a; xml &…

yolov8目标检测数据集制作——make sense

背景 在前几天我进行了录制视频以准备足够多的数据集&#xff0c;同时使用利用python自定义间隔帧数获取视频转存为图片&#xff0c;所以今天我准备对我要训练的数据集进行标注。我要做的是一个基于yolo的检测项目&#xff0c;在搜索资料后得知大家多是用labelme或者make sens…

桥接模式简介

在Java中&#xff0c;桥接模式&#xff08;Bridge Pattern&#xff09;的核心思想是将抽象部分与其实现部分分离&#xff0c;使其可以独立变化。以下是桥接模式的一个简单示例&#xff0c;我们将创建一个图形渲染系统&#xff0c;该系统允许用户选择不同的形状&#xff08;抽象…

redis-大key优化

什么是大key Redis 中的“大 key”问题指的是单个键&#xff08;key&#xff09;所存储的值&#xff08;value&#xff09;过大&#xff0c;导致影响 Redis 的性能和稳定性。通常情况下&#xff0c;Redis 的设计初衷是将数据存储在内存中&#xff0c;因此单个键的大小应该受到…

使用 VS Code + Github 搭建个人博客

搭建个人博客的方案 现在&#xff0c;搭建个人博客的方式有很多&#xff0c;门槛也很低。 可以选择已有平台&#xff1a; 掘金语雀知乎简书博客园SegmentFault… 也可以选择一些主流的博客框架&#xff0c;自行搭建。 HexoGitBookVuePressdumi… 如何选择&#xff1f; 我…

Java基础【异常】

异常是什么 异常是指程序执行过程中可能出现的错误或意外情况。 异常有哪些种类 编译异常 Checked Exception&#xff1a;这类异常在代码编译期间就被检测出来&#xff0c;必须显式地进行处理&#xff0c;否则编译不通过。常见的Checked Exception包括IOException、SQLExcept…

Chain of Note-CoN增强检索增强型语言模型的鲁棒性

Enhancing Robustness in Retrieval-Augmented Language Models 检索增强型语言模型&#xff08;RALMs&#xff09;在大型语言模型的能力上取得了重大进步&#xff0c;特别是在利用外部知识源减少事实性幻觉方面。然而&#xff0c;检索到的信息的可靠性并不总是有保证的。检索…

[ESP32]:基于HTTP实现百度AI识图

[ESP32]&#xff1a;基于HTTP实现百度AI识图 测试环境&#xff1a; esp32-s3esp idf 5.1 首先&#xff0c;先配置sdk&#xff0c;可以写入到sdkconfig.defaults CONFIG_IDF_TARGET"esp32s3" CONFIG_IDF_TARGET_ESP32S3yCONFIG_PARTITION_TABLE_CUSTOMy CONFIG_PA…

深度解析大模型的关键特性与优势

大模型通常指的是具有极其庞大参数规模、先进架构和广泛适用性的机器学习模型。这类模型因其前所未有的规模和强大的通用性而备受关注&#xff0c;下面是大模型的一些显著特点&#xff1a; 大规模参数量&#xff1a; 大模型的核心特征之一就是其庞大的参数规模&#xff0c;动辄…

值迭代和策略迭代【强化学习】

强化学习笔记 主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程&#xff0c;个人觉得赵老师的课件深入浅出&#xff0c;很适合入门. 第一章 强化学习基本概念 第二章 贝尔曼方程 第三章 贝尔曼最优方程 第四章 值迭代和策略迭代 文章目录 强化学习笔记一、Value It…

江苏开放大学2024年春《中级会计实务(上) 050284》第1次任务第一单元总论、第二单元存货练习参考答案

答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 电大搜题 多的用不完的题库&#xff…

Qt教程 — 3.6 深入了解Qt 控件:Display Widgets部件(2)

目录 1 Display Widgets简介 2 如何使用Display Widgets部件 2.1 QTextBrowser组件-简单的文本浏览器 ​2.2 QGraphicsView组件-简单的图像浏览器 Display Widgets将分为两篇文章介绍 文章1&#xff08;Qt教程 — 3.5 深入了解Qt 控件&#xff1a;Display Widgets部件-CSDN…

Magic Copy:一键AI抠图,在浏览器中获得任何图像素材

Magic Copy&#xff1a;轻松一点&#xff0c;精准抠图&#xff0c;让创意无限放大&#xff01; - 精选真开源&#xff0c;释放新价值。 概览 Magic Copy&#xff08;AI智能抠图插件&#xff09;是一个创新型的浏览器扩展工具&#xff0c;其独特之处在于能够无缝集成于用户的网…

CCDP.02.OS正确部署后的Dashboard摘图说明

前言 在部署成功OpenStack后&#xff0c;应该可以在浏览器打开Dashboard&#xff0c;并对计算资源&#xff08;这里主要是指VM&#xff09;进行管理&#xff0c;也可以在Dashboard上面查看OpenStack是否存在错误&#xff0c;下面&#xff0c;已针对检查的关键点&#xff0c;用红…

两个包装类型变量的比较问题

问题&#xff1a; 由于受包装类的自动装箱和拆箱的影响&#xff0c;一直以为直接用直接比较两个包装类的大小是否相等就可以&#xff0c;惭愧。比如&#xff1a; Integer a11; Integer b11; System.out.println(ab); 运行结果是 true&#xff0c;似乎没啥问题&#xff0c;但…

Mysql之索引存储原理

在介绍索引实现之前&#xff0c;我们先来了解下几种树的数据结构&#xff1a; 一、二叉搜索树 二叉搜索树有以下性质&#xff1a; 1.每个节点有一个关键字 2.左右孩子至多有一个。 3.关键字大于左孩子&#xff0c;小于右孩子。 正因为二叉搜索树的特性&#xff0c;所以这种数…