Nginx06-rewrite模块详解与实验

目录

  • 写在前面
  • 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.mfbz.cn/a/704969.html

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

相关文章

C# WPF入门学习主线篇(二十五)—— 单向绑定、双向绑定

C# WPF入门学习主线篇&#xff08;二十五&#xff09;—— 单向绑定、双向绑定 在WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;数据绑定是实现数据与UI控件同步的关键机制。本篇博客将详细介绍单向绑定和双向绑定的概念、使用场景以及代码示例。…

【仿真建模-anylogic】EventRate原理解析

Author&#xff1a;赵志乾 Date&#xff1a;2024-06-13 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 类图 2. 原理解析 EventOriginator是Anylogic中各类事件的父类&#xff0c;对外暴露的接口主要有: 函数功能boolean isActive()判定…

上午接到被裁员的通知,下午就收到涨薪30%的offer,我生怕公司反悔,当天就找HR签了离职协议,拿到了N+1赔偿!

大家好&#xff0c;我是瑶琴呀。 昨天看到一位网友分享自己被裁的经历&#xff1a;最近这段时间在面试&#xff0c;没成想上午刚被 HR 约谈裁员的事情&#xff0c;下午就收到下家公司涨薪 30% 的offer&#xff0c;这可真是天时人和&#xff0c;当天下午就找 HR 签了离职协议&a…

有一个主域名跟多个二级子域名时该怎么申请SSL证书?

当您拥有主域名以及多个子域名时&#xff0c;选择合适的SSL证书类型对于确保网站的安全性至关重要。以下是三种SSL证书类型的简要介绍&#xff1a; 单域名SSL证书&#xff1a; 功能&#xff1a;只能绑定单个域名&#xff0c;无论是主域名还是子域名。 适用场景&#xff1a;仅…

Linux系统使用Docker安装Dashy导航页结合内网穿透一键发布公网

文章目录 简介1. 安装Dashy2. 安装cpolar3.配置公网访问地址4. 固定域名访问 简介 Dashy 是一个开源的自托管的导航页配置服务&#xff0c;具有易于使用的可视化编辑器、状态检查、小工具和主题等功能。你可以将自己常用的一些网站聚合起来放在一起&#xff0c;形成自己的导航…

比特币对接文档

比特币对接 地址分类 p2sk()p2skh(主网地址是以"1"开头,例如:16dN3XhaTejyZFy4hWompK2x8de2T46wA8; 测试网是以"m"或"n"开头, 例如:mvZjn2485hwxjVPJoLAZVyJKUDn8aGpBy5)p2sh (主网地址是以"3"开头,例如:33ZzFZZJcvtnLBWRdne6F9SpD9…

数据结构笔记1-19(补充之前没有提及的细节)

目录 算法的五大特征 时间复杂度 next数组 nextval数组 树结点的计算 满二叉树和完全二叉树 线索二叉树 树的存储结构 森林、树之间的转换 哈夫曼树的构造 这几个红框&#xff0c;因为之前在别的视频有学过了&#xff0c;故不再看了。如果到时候还有什么需要查缺补…

Linux内核编程(二)杂项设备模型驱动编写

本文目录 一、知识点1. Linux设备分类2. 设备号3. Linux 字符设备的几种编程模型 二、杂项设备模型API1. 杂项设备结构体2. 注册杂项设备3. 注销杂项设备4. copy_from_user5. copy_to_user 三、字符设备编程 查看&#xff1a;内核驱动程序编写环境搭建。 一、知识点 1. Linux设…

高考结束嗨一夏,AOC显示器暑期购机指南来了!

摘要&#xff1a;AOC显示器&#xff0c;暑期狂欢&#xff0c;近在眼前&#xff01; 历经三年紧张备战&#xff0c;高考已然画下句号。过去的时间里&#xff0c;你们挥洒汗水&#xff0c;刻苦学习&#xff0c;未来的时间里&#xff0c;也将迎来短暂的休憩嗨皮时光。这个暑假里&…

SaaS产品运营 | 千万不能踏入的PLG模式的六大误区

随着科技的迅速发展和市场竞争的日益激烈&#xff0c;越来越多的公司开始尝试采用PLG&#xff08;Product Led Growth&#xff0c;即产品驱动增长&#xff09;模式来推动其业务的发展。然而&#xff0c;尽管PLG模式在促进增长方面具有显著优势&#xff0c;但在实践中也容易出现…

一文学会Spring 实现事务,事务的隔离级别以及事务的传播机制

目录 一.Spring (Spring Boot) 实现事务 1.通过代码的方式手动实现事务 (手动档的车) 2.通过注解的方式实现声明式事务 (自动挡的车) 二.事务的4大特性(ACID) 三.事务的隔离级别 ①Mysql的事务隔离级别: ②Spring的事务隔离级别: 四.事务的传播机制 ①事务传播机制的概…

ASCII码表介绍

一、ASCII码是什么 ASCII&#xff08;American Standard Code for Information Interchange&#xff0c;美国信息交换标准代码&#xff09;是基于拉丁字母的一套电脑编码系统。它可分为基于7位二进制数的标准版本和基于8位二进制数的扩展版本&#xff0c;标准版本主要用于显示现…

[AI Stability] 开源AI新利器:Stable Diffusion 3 Medium震撼发布!文本到图像再升级!

Stable Diffusion 3 Medium(SD3) 开源了&#xff0c;我们来看下。 关键要点 Stable Diffusion 3 Medium 是 Stability AI 迄今为止最先进的文本到图像开源模型。该模型的体积小巧&#xff0c;非常适合在消费级 PC 和笔记本电脑上运行&#xff0c;也适合在企业级 GPU 上运行。…

精彩回顾!安全智能体的前沿技术研究与实践

&#xff08;关注“安全极客”&#xff0c;回复“智能体”下载第一期系列专题PPT&#xff01;&#xff09; 近日&#xff0c;安全极客和Wisemodel社区联合发起并主办了“AISecurity”系列第1期&#xff1a;大模型与网络空间安全前沿探索线下活动。在这次活动中&#xff0c;云起…

读取CSV文件生成RDD去掉标题行

文章目录 1. 创建CSV文件2. 上传CSV文件3. 读取CSV文件生成RDD4. 去掉标题行生成新RDD5. 查看新生成的RDD 1. 创建CSV文件 执行命令&#xff1a;vim scores.csv 在WPS里查看CSV文件 2. 上传CSV文件 执行命令&#xff1a;hdfs dfs -put scores.csv /park 3. 读取CSV文件生…

「漏洞复现」I Doc View 在线文档预览 qJvqhFt.json 任意文件读取漏洞(XVE-2024-2115)

0x01 免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删…

【 EI会议 | 西南大学主办 | 往届均已实现检索】第三届神经形态计算国际会议(ICNC 2024)

第三届神经形态计算国际会议&#xff08;ICNC 2024) 2024 3rd International Conference on Neuromorphic Computing (ICNC 2024) 一、重要信息 大会官网&#xff1a;www.ic-nc.org&#xff08;点击投稿/参会/了解会议详情&#xff09; 会议时间&#xff1a;2024年12月13-15…

在线的、完全免费的、提供回放的技术传播方面的大会:Adobe DITA World 2024

▲ 搜索“大龙谈智能内容”关注公众号▲ 最近美国苹果公司召开了WWDC24&#xff0c;国内不少人熬夜观看。 对于我来说&#xff0c;我更关注在美国召开的另外一个会&#xff0c;它就是Adobe DITA world。 一年一度的Adobe DITA world号称是全球最大的DITA营销和技术传播专业人…

【docker 不希望每次sudo docker cmd】

一、背景 ubuntu系统下安装好了docker 不希望每次sudo docker cmd&#xff0c;这样每次多输入很多字&#xff0c;比较麻烦 二、原理 在 Ubuntu 等 Linux 发行版上&#xff0c;使用 Docker 命令时常常需要使用 sudo 命令&#xff0c;这是因为 Docker 的服务是以 root 权限运行…

基于STM32和人工智能的智能交通管理系统

目录 引言环境准备智能交通管理系统基础代码实现&#xff1a;实现智能交通管理系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统4.4 用户界面与数据可视化应用场景&#xff1a;智能交通管理与优化问题解决方案与优化收尾与总结 1. 引言 随着城市化进程的加快&#xff0…