Nginx06-rewrite模块详解与实验

news2024/10/6 20:34:18

目录

  • 写在前面
  • Nginx06
    • nginx rewrite
      • rewrite 模块
        • return
          • 案例01 访问/admin/ 返回403
          • 案例02 域名间跳转
        • if
          • 案例03 只允许GET、POST请求,其他禁止访问
        • set
          • 案例04 设置是否处于维护状态,是则返回503,否则正常访问
        • rewrite
          • 案例05 域名跳转
          • 案例06 rewrite break和last小测试

写在前面

这是Nginx第六篇,内容为Nginx rewrite模块详解与实验等。
上篇笔记 Nginx05-负载均衡详解、LNMP+NFS、会话保持、负载均衡状态检查upstream-check、平滑升级

Nginx06

nginx rewrite

官网:https://nginx.org/en/docs/http/ngx_http_rewrite_module.html

重定向,也叫url重定向、url改写

  • 网站URL重定向(80->443)
  • 客户端类型跳转
    - 默认访问www.baidu.com
    - ios、android等,访问m.baidu.com
  • 新老域名跳转
    - www.360buy.com -> jd.com
  • 伪静态

rewrite 模块

相关的指令说明
return实现对URL的改写,一般与ngx变量一起使用。可以用来直接返回指定的HTTP状态码给客户端。
rewrite实现对URL的改写,使用正则匹配URI,进行改写。支持各种标记,如lastbreakredirectpermanent,用于控制重写后的行为。
set创建或修改ngx变量。用于在Nginx配置中设置变量值,这些变量可以在后续的配置中使用。
if用于条件判断,一般与ngx变量一起使用。根据指定的条件判断是否执行后面的配置指令。
return
格式说明
格式1return code URL; 返回状态码+新的URL地址。这种格式用于重定向用户到新的URL,并返回指定的HTTP状态码。
格式2return code; 返回指定状态码。这种格式用于直接返回一个HTTP状态码给客户端,而不进行重定向。
放哪这些return指令可以放在Nginx配置文件中的server块、location块或if语句中。
案例01 访问/admin/ 返回403
  1. 编写子配置文件
[root@front conf.d]# cat rewrite.test.com.conf
server {
        listen 80;
        server_name rewrite.test.com;
        root /app/code/rewrite;
        location / {
                index index.html;
        }
        location /admin/ {
                return 403;
        }
}

  1. 测试
C:\Users\14765>curl -H Host:rewrite.test.com http://192.168.100.148/admin/
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
案例02 域名间跳转
  1. 编写子配置文件

[root@front conf.d]# cat tiaozhuan.test.com.conf
server {
        listen 80;
        server_name tiaozhuan.test.com;
        return 301 http://rewrite.test.com;
}

  1. 测试

curl -L --location 跟随跳转,响应是301,302跳转的时候使用.

[root@front conf.d]# curl -Lv -H Host:tiaozhuan.test.com 192.168.100.148
* Rebuilt URL to: 192.168.100.148/
*   Trying 192.168.100.148...
* TCP_NODELAY set
* Connected to 192.168.100.148 (192.168.100.148) port 80 (#0)
> GET / HTTP/1.1
> Host:tiaozhuan.test.com #访问第一个url
> User-Agent: curl/7.61.1
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently 
< Server: Tengine/2.4.1
< Date: Wed, 12 Jun 2024 14:20:04 GMT
< Content-Type: text/html
< Content-Length: 245
< Connection: keep-alive
< Location: http://rewrite.test.com  # 301重定向的url
< 
* Ignoring the response-body
* Connection #0 to host 192.168.100.148 left intact
* Issue another request to this URL: 'http://rewrite.test.com'
* Rebuilt URL to: http://rewrite.test.com/
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to rewrite.test.com (127.0.0.1) port 80 (#1)
> GET / HTTP/1.1
> Host: rewrite.test.com # 访问重定向的url
> User-Agent: curl/7.61.1
> Accept: */*
>
< HTTP/1.1 200 OK # 访问成功
< Server: Tengine/2.4.1
< Date: Wed, 12 Jun 2024 14:20:04 GMT
< Content-Type: text/html
< Content-Length: 8
< Last-Modified: Tue, 11 Jun 2024 15:29:42 GMT
< Connection: keep-alive
< ETag: "66686d66-8"
< Accept-Ranges: bytes
<
rewrite   # 跳转成功
* Connection #1 to host rewrite.test.com left intact

if

通过nginx变量进行判断、比大小、匹配、过滤
nginx中的取反操作,只能if进行

  • 格式
if (condition) {
        action1;
        action2;
        ...
}
  • 位置
    - server模块内
    - location模块内
  • 符号
    | 条件类型 | 说明 |
    | -------- | ---- |
    | 变量比较 | 如果变量值为空字符串或“0”,则为假。在Nginx 1.0.1版本之前,任何以“0”开头的字符串都被视为假值。 |
    | 字符串比较 | 使用“=”和“!=”运算符比较变量与字符串。 |
    | 正则匹配 | 使用“”进行大小写敏感匹配,使用“”进行大小写不敏感匹配。正则表达式可以包含捕获组,这些捕获组在后续的配置中可以使用。负运算符“!”和“!”也支持。如果正则表达式包含“}”或“;”字符,整个表达式应被单引号或双引号包围。 |
    | 文件存在性检查 | 使用“-f”和“!-f”运算符检查文件是否存在。 |
    | 目录存在性检查 | 使用“-d”和“!-d”运算符检查目录是否存在。 |
    | 文件、目录或符号链接存在性检查 | 使用“-e”和“!-e”运算符检查文件、目录或符号链接是否存在。 |
    | 可执行文件检查 | 使用“-x”和“!-x”运算符检查文件是否可执行。 |
案例03 只允许GET、POST请求,其他禁止访问

官网:https://nginx.org/en/docs/varindex.html
使用到的变量: $request_method 取出请求方法

  1. 子配置文件
[root@front conf.d]# cat rewrite.test.com.conf
server {
        listen 80;
        server_name rewrite.test.com;
        root /app/code/rewrite;
        location / {
                index index.html;
        }
        location /admin/ {
                return 403;
        }
        if ($request_method !~ "GET|POST"){
                return 403;
        }
}

  1. 测试
# GET,请求成功
[root@front conf.d]# curl -H Host:rewrite.test.com 192.168.100.148
rewrite


# HEAD,请求失败
#  -I, --head          Show document info only
[root@front conf.d]# curl -I -H Host:rewrite.test.com 192.168.100.148
HTTP/1.1 403 Forbidden
Server: Tengine/2.4.1
Date: Wed, 12 Jun 2024 14:59:10 GMT
Content-Type: text/html
Content-Length: 557
Connection: keep-alive

set

用于创建或修改nginx自定义变量,一般和if一起用
nginx变量进行赋值和使用都需要加$,这点和shell不一样

  • 格式
# nginx
set 变量 值;
set $test key;

# shell
test=key
案例04 设置是否处于维护状态,是则返回503,否则正常访问

设置变量 f l a g ,默认 0 判断 flag,默认0 判断 flag,默认0判断flag是否为1,是则503

  1. 子配置文件
[root@front conf.d]# cat rewrite.test.com.conf
server {
        listen 80;
        server_name rewrite.test.com;
        root /app/code/rewrite;
        set $flag 0; # 添加,测试时会修改为0或1用于模拟是否处于维护状态
        # 添加以下3行判断
        if ($flag = 1) { 
                return 503; 
        } 

        location / {
                index index.html;
        }
        location /admin/ {
                return 403;
        }
        if ($request_method !~ "GET|POST"){
                return 403;
        }
}

  1. 测试
# $flag 为0
[root@front conf.d]# curl -H Host:rewrite.test.com 192.168.100.148
rewrite

# $flag 为1
## 替换0 为1
## sed -i "/set/s|0|1|g" rewrite.test.com.conf   筛选包含set的行进行修改
[root@front conf.d]# curl -H Host:rewrite.test.com 192.168.100.148
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head><title>503 Service Temporarily Unavailable</title></head>
<body>
<center><h1>503 Service Temporarily Unavailable</h1></center>

rewrite

rewrite正则用于匹配用户请求的uri
支持普通正则、扩展正则、过滤、perl正则等
命令的格式与sed ‘s|||g’ 类似,实现替换功能,rewrite替换url内容.(改写)

  • 格式
    - rewrite 找什么(具体内容/正则/保护分组) ->替换成什么(具体内容/后向引用) [标记];
    - 标记可以省略,默认使用redirect标记(302)
    - redirect 302
    - permanent 301
  • 位置
    - server、location、if
  • 标记
    | 标记 | 说明 | 补充 |
    | ---------- | ------- | ------- |
    | redirect | 302 临时 用户访问的时候,收到302提示及新的位置Location(响应头),用户根据Location新的位置进行访问(让用户重新发出http请求) | 新旧地址都可以用。 |
    | permanent | 301 永久 用户访问的时候,收到302提示及新的位置Location(响应头),用户根据Location新的位置进行访问(让用户重新发出http请求) | 旧的地址排名取消,旧地旧的不用了,只用新的网站。 |
    | break | 用户的请求匹配到包含break指令或rewrite规则后,即使后面还有location规则,也不会继续运行。终止运行。 | 表示在当前rewrite规则执行后停止后续的rewrite规则和location匹配。 |
    | last | 用户请求匹配到包含last标记的rewrite规则后,停止继续执行,Nginx会重新发出内部请求,请求与location规则进行匹配。 | 表示在当前rewrite规则执行后,不再执行后续的rewrite规则,而是重新发起请求。 |
案例05 域名跳转
  1. 子配置文件
# nginx配置文件不是#注释,使用时需要把注释删掉
[root@front conf.d]# vim rewrite.test.com.conf
server {
        listen 80;
        server_name rewrite.test.com;
        #return 301 http://www.baidu.com$request_uri;
        rewrite ^(.*)$ http://www.baidu.com$1 permanent;
        # 匹配rewrite.test.com/xxx/yyy的/xxx/yyy部分(uri),通过反向引用,重定向baidu.com之后
        # rewrite.test.com/xxx/yyy -> www.baidu.com/xxx/yyy
        # permanent 永久重定向 301,不写默认302
}

  1. 测试
  • 浏览器访问 https://rewrite.test.com/test.com
  • 自动rewrite,重定向到baidu.com,携带uri
    在这里插入图片描述
案例06 rewrite break和last小测试
  1. 子配置文件
[root@front conf.d]# cat flag.test.com.conf
server {
        listen 80;
        server_name flag.test.com;
        root /app/code/flag;
        error_log /var/log/nginx/flag-error.log notice;
        rewrite_log on;

        location / {
                rewrite /1.html /2.html;
                rewrite /2.html /3.html;
        }
        location /2.html {
                rewrite /2.html /3.html;
        }
        location /3.html {
                rewrite /3.html /a.html;
        }
}


# 测试文件
[root@front conf.d]# mkdir -p /app/code/flag
[root@front conf.d]# echo 1.html url > /app/code/flag/1.html
[root@front conf.d]# echo 2.html url > /app/code/flag/2.html
[root@front conf.d]# echo 4.html url > /app/code/flag/3.html
[root@front conf.d]# echo 3.html url > /app/code/flag/3.html
[root@front conf.d]# echo a.html url > /app/code/flag/a.html
[root@front conf.d]# echo b.html url > /app/code/flag/b.html

  1. 正常访问
[root@front conf.d]# curl -H Host:flag.test.com 192.168.100.148/1.html
a.html url
[root@front conf.d]# curl -H Host:flag.test.com 192.168.100.148/2.html
a.html url

# 匹配默认location/ loc/:1->2 2->3 loc3:3->a
  1. break测试
# 在第一个rewrite处增加break
[root@front conf.d]# cat flag.test.com.conf
server {
        listen 80;
        server_name flag.test.com;
        root /app/code/flag;
        error_log /var/log/nginx/flag-error.log notice;
        rewrite_log on;

        location / {
                rewrite /1.html /2.html break; # 修改
                rewrite /2.html /3.html;
        }
        location /2.html {
                rewrite /2.html /3.html;
        }
        location /3.html {
                rewrite /3.html /a.html;
        }
}

# 测试
[root@front conf.d]# curl -H Host:flag.test.com 192.168.100.148/1.html
2.html url
[root@front conf.d]# curl -H Host:flag.test.com 192.168.100.148/2.html
a.html url

# loc/:1->2 break打断,不再执行,后续location也不执行
  1. last测试
# 在第一个rewrite处加last;在第二个location的rewrite处将/3.html修改为/b.html
[root@front conf.d]# cat flag.test.com.conf
server {
        listen 80;
        server_name flag.test.com;
        root /app/code/flag;
        error_log /var/log/nginx/flag-error.log notice;
        rewrite_log on;

        location / {
                rewrite /1.html /2.html last; # 修改
                rewrite /2.html /3.html;
        }
        location /2.html {
                rewrite /2.html /b.html; # 修改
        }
        location /3.html {
                rewrite /3.html /a.html;
        }
}


# 测试
[root@front conf.d]# curl -H Host:flag.test.com 192.168.100.148/1.html
b.html url
[root@front conf.d]# curl -H Host:flag.test.com 192.168.100.148/2.html
b.html url

# loc/:1->2 last打断,执行下一个location  loc2:2->b

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

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

相关文章

htb_Blurry

端口扫描 8 按照教程注册安装clear ml 加载configuration的时候会报错 将json里的API&#xff0c;File Store的host都添加到/etc/hosts中 即可成功初始化 查找clear ml漏洞 发现一个cve-2024-24590 下面是一个利用脚本&#xff0c;但不能直接用 ClearML-vulnerability-e…

5G消息 x 融媒 | 媒体融合新入口

5G消息 x 融媒 | 媒体融合新入口 5G 消息是 5G 时代三大运营商联合手机厂商推出的平台型应用&#xff0c;5G 消息以短信为入口&#xff0c;以富媒体消息为媒介&#xff0c;具有权威真实、全面覆盖、精准投放、内容汇聚、开放共享等特点。这些特点符合当下融媒体发展的需求&…

ubuntu下使用cmake编译opencv4.8.0+ffmpeg4.2.2+cuda11.1

1.源码下载 &#xff08;1&#xff09;下载ffmpeg4.2.2、opencv4.8.0源码&#xff0c;这里提供一个百度网盘地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1pBksr0_RtKL0cM6Gsf2MGA?pwdcyai 提取码&#xff1a;cyai &#xff08;2&#xff09;解压所有文件 例…

c++实现二叉搜索树(上)

宝贝们&#xff0c;好久不见&#xff0c;甚是想念&#x1f917;小吉断更了差多有10多天&#xff0c;在断更的日子里&#xff0c;小吉也有在好好学习数据结构与算法&#xff0c;但是学的并不多而且学的并不是很认真。主要是中途笔记本屏出现问题了&#xff08;这件事有点让小吉我…

迅狐短视频矩阵管理系统核心功能

一、多平台管理&#xff1a;连接多个主流自媒体平台&#xff0c;满足多平台、多账号、多角色的协调需求 在现如今的多元化媒体环境中&#xff0c;一个优秀的内容创作者需要同时管理多个自媒体平台&#xff0c;并以不同的身份角色展现自己。迅狐短视频矩阵管理系统强大的多平台…

RPC(远程过程调用):技术原理、应用场景与发展趋势

摘要&#xff1a; RPC&#xff08;Remote Procedure Call&#xff09;是一种通信协议&#xff0c;用于实现跨网络的进程间通信。它提供了一种简单高效的方式&#xff0c;使得分布式系统中的不同组件能够像调用本地函数一样调用远程函数。本篇博客将介绍RPC的基本概念&#xff0…

kafka 快速上手

下载 Apache Kafka 演示window 安装 编写启动脚本,脚本的路径根据自己实际的来 启动说明 先启动zookeeper后启动kafka,关闭是先关kafka,然后关闭zookeeper 巧记&#xff1a; 铲屎官&#xff08;zookeeper&#xff09;总是第一个到&#xff0c;最后一个走 启动zookeeper call bi…

虚拟声卡实现音频回环

虚拟声卡实现音频回环 一、电脑扬声器播放声音路由到麦克风1. Voicemeeters安装设置2. 音频设备选择 二、回声模拟 一、电脑扬声器播放声音路由到麦克风 1. Voicemeeters安装设置 2. 音频设备选择 以腾讯会议为例 二、回声模拟 选中物理输入设备“Stereo Input 1”和物理输出设…

浅谈内联钩取原理与实现

前言 导入地址表钩取的方法容易实现但是存在缺陷&#xff0c;若需要钩取的函数不存在导入地址表中&#xff0c;那么我们就无法进行钩取&#xff0c;出现以下几种情况时&#xff0c;导入函数是不会存储在导入地址表中的。 延迟加载&#xff1a;当导入函数还没调用时&#xff0…

Rust 实战丨通过实现 json! 掌握声明宏

在 Rust 编程语言中&#xff0c;宏是一种强大的工具&#xff0c;可以用于在编译时生成代码。json! 是一个在 Rust 中广泛使用的宏&#xff0c;它允许我们在 Rust 代码中方便地创建 JSON 数据。 声明宏&#xff08;declarative macros&#xff09;是 Rust 中的一种宏&#xff0…

debug调试_以Pycharm为例

文章目录 作用步骤打断点调试调试窗口 作用 主要是检查逻辑错误&#xff0c;而非语法错误。 步骤 打断点 在需要调试的代码行前打断点&#xff0c;执行后会停顿在断点位置&#xff08;不运行&#xff09; 调试 右键“debug”&#xff0c;或者直接点击右上角的小虫子 调试…

2-2 基于matlab的变邻域

基于matlab的变邻域&#xff0c;含变惯性权重策略的自适应离散粒子群算法&#xff0c;适应函数是多式联运路径优化距离。有10城市、30城市、75城市三个案例。可直接运行。 2-2 路径规划 自适应离散粒子群算法 - 小红书 (xiaohongshu.com)

Vue基本使用-02

上节我们讲了什么是mvvm模型&#xff0c;以及我们vue的一些常用指令&#xff0c;今天给大家讲一下vue的基本使用&#xff0c;在将之前我们需要重点讲解我们的一个指令&#xff0c;v-model指令 v-model v-model 可以在组件上使用以实现双向绑定,什么是双向绑定呢?意思就是当我们…

【Ubuntu双系统】两块硬盘分别安装系统,一块硬盘安装Ubuntu 一块安装Windows

【Ubuntu双系统】两块硬盘分别安装双系统&#xff0c;一块硬盘安装Ubuntu 一块安装Windows 前言安装Ubuntu前置操作安装过程参考文献 前言 机器情况&#xff1a;两块1T的硬盘&#xff0c;其中一块已安装Windows 11现需在另一块硬盘上安装Ubuntu&#xff0c;该硬盘还未初始化Ub…

SQL聚合函数---汇总数据

此篇文章内容均来自与mysql必知必会教材&#xff0c;后期有衍生会继续更新、补充知识体系结构 文章目录 SQL聚集函数表&#xff1a;AGV()count()根据需求可以进行组合处理 max()min()max&#xff08;&#xff09;、min&#xff08;&#xff09;、avg&#xff08;&#xff09;组…

Mac下载了docker,在终端使用docker命令时用不了

问题&#xff1a;在mac使用docker的时候&#xff0c;拉取docker镜像失败 原因&#xff1a;docker是需要用app使用的 &#xff0c;所以在使用的时候必须打开这个桌面端软件才可以在终端上使用docker命令&#xff01;&#xff01;&#xff01;

【PL理论】(21) 函数式语言:支持匿名函数 fun x → E | 设计递归函数 | 支持递归函数:let rec ...

&#x1f4ad; 写在前面&#xff1a;本章我们将讲解支持匿名函数&#xff0c;先回顾一下 F# 语言表示函数的方法&#xff0c;然后引出它。随后我们讲解一下如何设计递归函数&#xff0c;最后让我们的 F- 语言支持递归函数。 目录 0x00 回顾&#xff1a;F# 语言 0x01 支持匿名…

深度学习笔记: 最详尽Airbnb租赁搜索排名设计

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家&#xff01; Airbnb租赁搜索排名 1. 问题陈述 Airbnb用户在特定地点搜索可用房源。系统应在搜索结果中对多个房源进…

Qt飞机大战小游戏

Gitee地址 &#xff1a;plane-game: 基于Qt的飞机大战小游戏 GitHub地址&#xff1a; https://github.com/a-mo-xi-wei/plane-game

Vue25-内置指令02:v-text指令

一、v-html对比v-text v-html支持结构的解析&#xff0c;v-text不支持结构的解析。 二、v-html的安全性问题 2-1、cookie的原理&#xff08;node.js&#xff09; 7天免登录&#xff0c;cookie实现。 cookie的本质就是类似于json的字符串&#xff0c;格式是&#xff1a;key-va…