分布式 - 服务器Nginx:一小时入门系列之 rewrite 指令

文章目录

      • 1. rewrite 指令语法
      • 2. rewrite 指令示例
      • 3. 不使用 last 和 break 重写规则
      • 4. 使用 break 重写规则
      • 5. 使用 last 重写规则

1. rewrite 指令语法

nginx的rewrite指令用于重写URL,可以将一个URL重写为另一个URL。它的语法如下:

rewrite regex replacement [flag];

其中,regex是一个正则表达式,用于匹配需要重写的URL;replacement是重写后的URL;flag是可选的标志,用于控制重写的行为。flag 的常见取值为 last 和 break,都是用于控制重写规则执行的指令:

① break指令会立即停止当前的rewrite规则,并将处理流程交给下一个指令。也就是说,如果当前规则匹配成功,那么后面的规则将不会再被执行。如果没有匹配成功,则会继续执行后面的规则。

② last指令会停止当前的rewrite规则,并将处理流程交给nginx的下一个阶段。也就是说,如果当前规则匹配成功,那么后面的规则也会被执行。如果没有匹配成功,则会继续执行后面的规则。

需要注意的是,break和last指令的区别在于是否继续执行后面的规则。如果需要停止后面的规则,使用break指令;如果需要继续执行后面的规则,使用last指令。

rewrite 指令会导致请求的重新处理,因此可能会影响性能,因此,应该尽量避免在高并发场景下使用rewrite指令。

2. rewrite 指令示例

① Nginx 配置文件 8002.conf:

server{listen 8002;server_name rioyi.tomcat;# 请求转达到 http://localhost:8080location / {proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://localhost:8080;}# 请求ie页面location = /html/ie.html {root  /some/path/static;}# 请求字体文件location ^~ /fonts/ {root  /some/path/static;}# css|js|png|jpg|gif|ico 页面location ~ \.(css|js|png|jpg|gif|ico) {root /some/path/static;}
}

② 访问 http://192.168.1.9:8002 并登录若依管理系统上传一个图片,在响应中获取上传图片的访问路径:http://192.168.1.9:8002/profile/upload/2023/08/26/Spring3_20230826191911A002.jpg,直接在浏览器访问该图片会报错404,因为请求会去访问 /some/path/static 目录下的文件。

{"msg": "操作成功","fileName": "/profile/upload/2023/08/26/Spring3_20230826191911A002.jpg","code": 0,"newFileName": "Spring3_20230826191911A002.jpg","url": "http://192.168.1.9:8002/profile/upload/2023/08/26/Spring3_20230826191911A002.jpg","originalFilename": "Spring3.jpg"
}

在浏览器当访问图片 http://192.168.1.9:8002/profile/upload/2023/08/26/Spring3_20230826191911A002.jpg 时报错 404 Not Found,因为访问该jpg文件时会去访问 /some/path/static 目录下的文件,因此报错 404 Not Found。

③ 利用 rewrite 指令将请求URL重写为另一个URL,直接访问服务器图片地址:

server{listen 8002;server_name rioyi.tomcat;# 将所有以“/profile/upload”开头的请求重写为“http://192.168.1.9:8080”加上原始请求的URIrewrite_log on;rewrite ^/profile/upload http://192.168.1.9:8080$request_uri;# 请求转达到 http://localhost:8080location / {proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://localhost:8080;}# 请求ie页面location = /html/ie.html {root  /some/path/static;}# 请求字体文件location ^~ /fonts/ {root  /some/path/static;}# css|js|png|jpg|gif|ico 页面location ~ \.(css|js|png|jpg|gif|ico) {root /some/path/static;}
}

④ 访问 http://192.168.1.9:8002/profile/upload/2023/08/26/Spring3_20230826191911A002.jpg 会重定向到 http://192.168.1.9:8080/profile/upload/2023/08/26/Spring3_20230826191911A002.jpg

3. 不使用 last 和 break 重写规则

① 在 /home/AdminLTE-3.2.0/pages下创建一个1.txt,里面内容是this is a file

server{listen 8000;server_name localhost;rewrite_log on;location / {rewrite ^/old/(.*) /new/$1;rewrite ^/new/(.*) /pages/$1;root /home/AdminLTE-3.2.0;index index.html index2.html index3.html;}location /pages/1.txt {return 200 "this is rewrite test!";}
}

Nginx 服务器配置文件监听本地 8000 端口,配置了 rewrite_log 开启重写日志记录。当请求的URL为 /old/1.txt 时,第一条 rewrite 规则将以 /old/ 开头的请求重写为以 /new/ 开头的请求,第二条 rewrite 规则将以 /new/ 开头的请求重写为以 /pages/ 开头的请求,最后接着匹配以 /pages/1.txt 结尾的请求,使用 return 指令返回状态码 200 和消息体 “this is rewrite test!”

② 访问 http://192.168.1.9:8000/old/1.txt,默认以顺序执行:

[root@nginx-dev conf.d]# curl -i http://192.168.1.9:8000/old/1.txt
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Sat, 26 Aug 2023 12:55:50 GMT
Content-Type: text/plain
Content-Length: 21
Connection: keep-alivethis is rewrite test!

③ 查看 rewrite 日志:

==> /var/log/nginx/error.log <==
2023/08/26 20:55:50 [notice] 6214#6214: *209 "^/old/(.*)" matches "/old/1.txt", client: 192.168.1.9, server: localhost, request: "GET /old/1.txt HTTP/1.1", host: "192.168.1.9:8000"2023/08/26 20:55:50 [notice] 6214#6214: *209 rewritten data: "/new/1.txt", args: "", client: 192.168.1.9, server: localhost, request: "GET /old/1.txt HTTP/1.1", host: "192.168.1.9:8000"2023/08/26 20:55:50 [notice] 6214#6214: *209 "^/new/(.*)" matches "/new/1.txt", client: 192.168.1.9, server: localhost, request: "GET /old/1.txt HTTP/1.1", host: "192.168.1.9:8000"2023/08/26 20:55:50 [notice] 6214#6214: *209 rewritten data: "/pages/1.txt", args: "", client: 192.168.1.9, server: localhost, request: "GET /old/1.txt HTTP/1.1", host: "192.168.1.9:8000"
==> /var/log/nginx/access.log <==

4. 使用 break 重写规则

break指令会立即停止当前的rewrite规则,并将处理流程交给下一个指令。也就是说,如果当前规则匹配成功,那么后面的规则将不会再被执行。如果没有匹配成功,则会继续执行后面的规则。

① Nginx 配置文件 8000.conf:

break 指令不执行后续的rewrite规则,以新的/new/1.txt路径去执行块内的其他指令。

server{listen 8000;server_name localhost;rewrite_log on;location / {rewrite ^/old/(.*) /new/$1 break;rewrite ^/new/(.*) /pages/$1;root /home/AdminLTE-3.2.0;index index.html index2.html index3.html;}location /pages/1.txt {return 200 "this is rewrite test!";}
}

当请求的URL为 /old/1.txt 时,第一条规则将会匹配并将其重写为/new/1.txt,然后使用break关键字终止 rewrite 规则的匹配。 nginx将不再继续匹配后续的rewrite规则,而是直接使用当前规则的重写结果进行请求处理。

② 访问 http://192.168.1.9:8000/old/1.txt :报错 404 Not Found

[root@nginx-dev conf.d]# curl -i http://192.168.1.9:8000/old/1.txt
HTTP/1.1 404 Not Found
Server: nginx/1.24.0
Date: Sat, 26 Aug 2023 13:08:49 GMT
Content-Type: text/html
Content-Length: 153
Connection: keep-alive<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.24.0</center>
</body>
</html>

③ 查看 rewrite 日志:

2023/08/26 21:08:49 [notice] 6283#6283: *210 "^/old/(.*)" matches "/old/1.txt", client: 192.168.1.9, server: localhost, request: "GET /old/1.txt HTTP/1.1", host: "192.168.1.9:8000"2023/08/26 21:08:49 [notice] 6283#6283: *210 rewritten data: "/new/1.txt", args: "", client: 192.168.1.9, server: localhost, request: "GET /old/1.txt HTTP/1.1", host: "192.168.1.9:8000"2023/08/26 21:08:49 [error] 6283#6283: *210 open() "/home/AdminLTE-3.2.0/new/1.txt" failed (2: No such file or directory), client: 192.168.1.9, server: localhost, request: "GET /old/1.txt HTTP/1.1", host: "192.168.1.9:8000"==> /var/log/nginx/access.log <==

5. 使用 last 重写规则

last指令会停止当前的rewrite规则,并将处理流程交给nginx的下一个阶段。也就是说,如果当前规则匹配成功,那么后面的规则也会被执行。如果没有匹配成功,则会继续执行后面的规则。

① Ngiinx 配置文件8000.conf:

server{listen 8000;server_name localhost;rewrite_log on;location / {rewrite ^/old/(.*) /new/$1 last;rewrite ^/new/(.*) /pages/$1;root /home/AdminLTE-3.2.0;index index.html index2.html index3.html;}location /pages/1.txt {return 200 "this is rewrite test!";}
}

② 测试:

[root@nginx-dev conf.d]# curl -i http://192.168.1.9:8000/old/1.txt
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Sat, 26 Aug 2023 13:42:02 GMT
Content-Type: text/plain
Content-Length: 21
Connection: keep-alivethis is rewrite test! 

③ 查看 rewrite 重写日志:

2023/08/26 21:42:02 [notice] 6346#6346: *211 "^/old/(.*)" matches "/old/1.txt", client: 192.168.1.9, server: localhost, request: "GET /old/1.txt HTTP/1.1", host: "192.168.1.9:8000"2023/08/26 21:42:02 [notice] 6346#6346: *211 rewritten data: "/new/1.txt", args: "", client: 192.168.1.9, server: localhost, request: "GET /old/1.txt HTTP/1.1", host: "192.168.1.9:8000"2023/08/26 21:42:02 [notice] 6346#6346: *211 "^/old/(.*)" does not match "/new/1.txt", client: 192.168.1.9, server: localhost, request: "GET /old/1.txt HTTP/1.1", host: "192.168.1.9:8000"2023/08/26 21:42:02 [notice] 6346#6346: *211 "^/new/(.*)" matches "/new/1.txt", client: 192.168.1.9, server: localhost, request: "GET /old/1.txt HTTP/1.1", host: "192.168.1.9:8000"2023/08/26 21:42:02 [notice] 6346#6346: *211 rewritten data: "/pages/1.txt", args: "", client: 192.168.1.9, server: localhost, request: "GET /old/1.txt HTTP/1.1", host: "192.168.1.9:8000"==> /var/log/nginx/access.log <==

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

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

相关文章

设置微软Edge浏览器主页和新标签页,摆脱扰人和分散注意力的主页

默认情况下&#xff0c;Microsoft Edge会向您显示世界上最令人分心和讨厌的主页&#xff08;也称为主屏幕&#xff09;。微软不想只向你展示一个搜索框&#xff0c;也许还有一个漂亮的背景或一些你喜欢的网站的快捷方式&#xff0c;而是想在你面前扔一堆新闻标题和广告。 你可…

Linux 终端命令行 产品介绍

Linux命令手册内置570多个Linux 命令&#xff0c;内容包含 Linux 命令手册。 【软件功能】&#xff1a; 文件传输 bye、ftp、ftpcount、ftpshut、ftpwho、ncftp、tftp、uucico、uucp、uupick、uuto、scp备份压缩 ar、bunzip2、bzip2、bzip2recover、compress、cpio、dump、gun…

全新抖音快手小红书去水印系统网站源码 | 支持几十种平台

全新抖音快手小红书去水印系统网站源码 | 支持几十种平台

视频行为分析——视频图像转换与ffmpeg相关操作

工具类说明 1. 图像视频转换 1.1 视频输出gif from moviepy.editor import VideoFileClip # 设置输入视频文件路径和输出GIF文件路径 input_video video.avi output_gif output.gif # 读取视频文件 video VideoFileClip(input_video) # 将视频保存为GIF文件 video.write_…

微信小程序左上角home图标的解决方法之一 层级混乱导致的home图标显示的问题 自定义左上角左侧图标的返回路径

这个项目的编辑页在tabbar上 导致跳到tabbar得使用wx.switchTab 保存后返回原来的页面就出现了左上角的home图标 本来想通过自定义home图标的跳转路径来解决这个问题 没想到居然找不到相关内容 有清楚的朋友麻烦给我留个言不胜感激 那我写一下我的骚操作 app.js globalData: {…

idea2023远程调试

使用idea2023版远程调试springboot 1.添加remote jvm debug 2.填写远程ip, 选择要调试项目 3.将 参数附带到需要远程调试的jar 命令之前, 重启即可, 命令一定要在jar包之前 , -agentlib:jdwptransportdt_socket,servery,suspendn,address5005即 java -agentlib:jdwptranspor…

Hive 服务管理脚本

#!/bin/bash HIVE_HOME/opt/software/hive-3.1.3 HIVE_LOG_HOME/opt/software/hive-3.1.3/logfunction checkLogDir {if [[ ! -e ${HIVE_LOG_HOME} ]]; thenecho "${HIVE_LOG_HOME} 目录不存在&#xff0c;正在创建。"mkdir -p ${HIVE_LOG_HOME}fi }function checkHi…

我们的第一个 Qt 窗口程序

Qt 入门实战教程&#xff08;目录&#xff09; Windows Qt 5.12.10下载与安装 为何使用Qt Creator开发QT 本文介绍用Qt自带的集成开发工具Qt Creator创建Qt默认的窗口程序。 本文不需要你另外安装Visual Studio 2022这样的集成开发环境&#xff0c;也不需要你再在Visual St…

docker发布项目及使用外部文件的情况处理

适用docker环境已搭建好 首先项目打jar包&#xff1a;server-cdzh-2.1.0-SNAPSHOT.jar 创建Dockerfile FROM java:8 ADD server-cdzh-2.1.0-SNAPSHOT.jar cdzh.jar EXPOSE 60156 ENTRYPOINT ["java","-jar","/cdzh.jar"] 在linux服务器新建…

【python】【centos】使用python杀死进程后自身也会退出

问题 使用python杀死进程后自身程序也会退出&#xff0c;无法执行后边的代码 这样不行&#xff1a; # cmd " ps -ef | grep -v grep | grep -E task_pull_and_submit.py$|upgrade_system.py$| awk {print $2}"# pids os.popen(cmd).read().strip(\n).split(\n)# p…

JPA实体类中使用联合主键

参考链接&#xff1a;JPA Primary Key 业务场景&#xff1a; 实体类Aaabc中需要将id1、id2作为联合主键来使用 方式一&#xff1a;使用IdClass 首先定义IdClass类 import lombok.Data; import java.io.Serializable;Data public class AaabcIdClass implements Serializable …

PDF可以修改内容吗?有什么注意的事项?

PDF是一种跨平台的电子文档格式&#xff0c;可以在各种设备上轻松阅读和共享。许多人喜欢将文档转换为PDF格式以确保格式的一致性和易读性。但是&#xff0c;PDF文件一般被认为是“只读”文件&#xff0c;即无法编辑。那么&#xff0c;PDF文件是否可以修改呢&#xff1f; 答案是…

vxe-table中树形结构

如图&#xff0c;同事让帮忙实现一个需求 从二级树节点开始&#xff0c;同时选中的只能有一个二级树节点&#xff0c;选中的二级树节点之下的子节点都可以被选中。否则不能被选中 直接上代码 需要注意的是&#xff0c;文中树状图传递的数据是打平的数据&#xff0c;设置代码是…

elementui tree 层级过多时,高亮状态无法选满整行

问题&#xff1a; 如上图所示&#xff0c;官方的tree组件&#xff0c;在层级很多时 elementui -tree 的高亮状态并没有选中整行。 &#xff08;衍生库 vue-easy-tree 也会出现此问题&#xff09; 原因&#xff1a; &#xff08;没有查看源码&#xff0c;只是根据dom简单定位…

实现 Trie (前缀树)

题目链接 实现 Trie (前缀树) 题目描述 注意点 word 和 prefix 仅由小写英文字母组成 解答思路 首先要理解前缀树是什么&#xff0c;参照该篇文章【图解算法】模板变式——带你彻底搞懂字典树(Trie树)在了解前缀树是什么后&#xff0c;设计前缀树就会更加容易&#xff0c;…

ZLMediaKit 各种推拉流

1 用ffmpeg 推音视频流 ./ffmpeg -f dshow -i video"HP Wide Vision HD Camera" -f dshow -i audio"麦克风阵列 (Realtek High Definition Audio)" -rtbufsize 100M -max_delay 100 -pix_fmt yuv420p -tune zerolatency -c:v libx264 -crf 18 -s 1280x720…

解决centos离线安装cmake找不到OpenSSL问题

安装方法&#xff1a;见另外一篇文章 https://blog.csdn.net/zhongxj183/article/details/118488629 按照文章下载了离线gcc 和OpenSSL&#xff0c;以及在cmake官网下载了最新版 cmake-3.27.4.tar.gz 顺利安装gcc 和OpenSSL 但执行编译cmake时&#xff0c;报错找不到OpenSSL…

11. 盛最多水的容器(c++题解)

11. 盛最多水的容器&#xff08;c题解&#xff09; 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大…

Python2022年03月Python二级 -- 编程题解析

Python软件编程等级考试二级——20220319 实操 第一题 实现统计字符串中的单词和单词出现的次数&#xff1a; 要求如下&#xff1a; &#xff08;1&#xff09;统计的语句为&#xff1a;to be or not to be that is a question &#xff08;2&#xff09;要求统计该句中出现…

linux打开端口命令是什么

linux打开端口命令是什么 linux开启端口的命令是 1 firewall-cmd --zonepublic --add-port端口/通讯协议 --permanent 需要注意的是&#xff0c;我们在开启指定端口后需要重启防火墙。 示例如下&#xff1a; 1、开启防火墙 1 systemctl start firewalld 2、开放指定端…