Nginx-rewrite模块详解

文章目录

  • 前言
  • 一、ngx_http_rewrite_module模块
  • 二、指令详解
    • 1.break
      • 案例
    • 2. if指令
      • 案例
    • 3. return指令
      • 案例:
      • return 的优先级
    • 4. rewrite指令
      • 案例
    • 5. set指令
  • 总结


前言

nginx一些场景,我们需要使用rewrite模块。例如域名改了,为了利用网站seo进行伪静态处理。通过判断来实现一些逻辑处理等。这里我们介绍下ngx_http_rewrite_module模块


一、ngx_http_rewrite_module模块

ngx_http_rewrite_module模块官网传送门
ngx_http_rewrite_module模块用于使用PCRE正则表达式更改请求URI、返回重定向和有条件选择配置。

二、指令详解

1.break

用法示例:

Syntax:	break;
Default:	—
Context:	server, location, if

停止处理当前的ngx_http_rewrite_module指令集。
注意: 如果break指令在location块中后续指令还会继续执行,只是不执行 ngx_http_rewrite_module 模块的指令,其它指令还会执行。

案例

配置

[root@private test]# cat rewritedemo.conf 
location /rewrite/break {
  set $name dog;
  echo $name;
  break;
  set $myport $server_port;  # set指令属于rewrite模块,break模块后不在执行; 
  echo $myport;
  echo $name;
}

执行结果如下:

[root@private test]# curl http://nginx.test.io:8081/rewrite/break
dog

dog

可以看出,

2. if指令

用法:

Syntax:	if (condition) { ... }
Default:	—
Context:	server, location

条件condition为真,则执行大括号内的指令;
Nginx的if语法仅能使用if做单次判断,不支持使用if else或者if elif这样的多重判断

  • 将变量和正则表达式做匹配 大小写敏感:~ 或者 !~ 大小写不敏感: ~*或者 !~*
  • 将变量和字符串做匹配,使用=或者 !=

案例

# 将变量和正则表达式做匹配
 if ($request_uri ~* ^/api/goods/delete) {
     set $del_flag 1;
 }

# 将变量和字符串做匹配
 if ( $del_flag = 1) {
   set $flag "del";
 }

# 判断传参
if ($args ~ userId=admin) {
  return 403 "该用户不允许修改";
}
# 判断客户端 
if ($http_user_agent ~ MSIE) {
  return 301 http://www.example.com/ie;
}

3. return指令

用法

Syntax:	return code [text];
return code URL;
return URL;
Default:	—
Context:	server, location, if

停止处理并将指定代码返回给客户端。非标准代码444关闭连接而不发送响应头。

案例:

# 自定义code,自定义返回文字
location / {
default_type application/json;
return 999 realip:$clientRealIp\r\nremoteaddr:$http_x_forwarded_for\r\naddr:$remote_addr;
# return 301 302 重定向
}

return 的优先级

下面的案例中,我们在location最后,return 401。 当我们访问nginx的时候,结果应该是返回多少呢?

server {
        server_name nginx.test.io;
        listen 8081;
        access_log off;
        default_type text/plain;


	location ~ /api/$ {
	  return 200 'first regular expressions match!\n';
	}

	location ~* /api/(\w+)$ {
	  return 200 'longest regular expressions match!\n';
	}			         

        location ^~ /api/ {
	  return 200 'stop regular expression match!\n';
	}

        location /api/test {
	  return 200 'logest prefix string match !\n';
	}

       location /api {
       	  return 200 'prefix string match!\n';
       }

       location = /api {
       	  return 200 'exact match!\n';
       }
       include test/rewritedemo.conf;   
       return 401;
}

在Nginx-HTTP请求的11个阶段文章中,我们了解到,nginx处理阶段中有出现了两次rewrite模块,NGX_HTTP_SERVER_REWRITE_PHASE和NGX_HTTP_REWRITE_PHASE,NGX_HTTP_SERVER_REWRITE_PHASE要在前,所以,上面案例中return 401; 在server块中要先一步执行返回,我们可以验证下。

[root@pri test]# curl http://nginx.test.io:8081/api/
<html>
<head><title>401 Authorization Required</title></head>
<body>
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx</center>
</body>
</html>
[root@pri test]# curl http://nginx.test.io:8081
<html>
<head><title>401 Authorization Required</title></head>
<body>
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx</center>
</body>
</html>
[root@pri test]# curl http://nginx.test.io:8081/
<html>
<head><title>401 Authorization Required</title></head>
<body>
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx</center>
</body>
</html>

4. rewrite指令

用法

Syntax:	rewrite regex replacement [flag];
Default:	—
Context:	server, location, if
  • 将regex指定的url替换成replacement这个新的url (可以使用正则表达式以及变量提取)
  • 当replacement以http://或者https://或者$schema开头,则直接返回302重定向
  • 替换后的url根据flag指定的方式进行处理。
    – last: 用replacement这个URL进行新的location匹配 (stops processing the current set of ngx_http_rewrite_module directives and starts a search for a new location matching the changed URI;)
    – break: break指令停止当前脚本指令的执行,等价于独立的break指令。(stops processing the current set of ngx_http_rewrite_module directives as with the break directive;)
    – redirect: 返回302重定向
    – permanent: 返回301重定向

案例

#  假设你有一个动态的新闻页面地址,例如:http://example.com/news.php?id=123,你想将其伪静态为:http://example.com/news/123.html。
#  你需要在Nginx配置文件中的server块中添加以下规则:
    location ~ ^/news/([0-9]+)\.html$ {
        rewrite ^/news/([0-9]+)\.html$ /news.php?id=$1 last;
    }

5. set指令

set 指令已经出现在上面一些案例中了,这里不用过多解释了。


总结

rewrite模块在nginxHTTP处理阶段中出现了两次,需要注意先后顺序,rewrite模块的使用场景还是比较丰富的,我们会陆续补充。

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

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

相关文章

langchain框架轻松实现本地RAG

一 什么是RAG? RAG&#xff08;Retrieval-Augmented Generation&#xff09;是一种结合了检索和生成模型的方法&#xff0c;主要用于解决序列到序列的任务&#xff0c;如问答、对话系统、文本摘要等。它的核心思想是通过从大量文档中检索相关信息&#xff0c;然后利用这些信息…

【Android面试八股文】你是怎么保证Android设备的时间与服务器时间同步的?(使用NTP和TrueTime方案)

文章目录 一、网络时间协议(NTP)二、使用网络时间协议(NTP)2.1 使用系统提供的 NTP 服务器2.2 使用TrueTime2.2.1 引入TrueTime库2.2.2 初始化 TrueTime2.2.3 用法2.2.4 使用 TrueTime 获取时间2.2.4 自动更新时间2.2.5 注意事项二. 使用 HTTP 请求获取服务器时间2.1. 发送…

鸿蒙开发设备管理:【@ohos.thermal (热管理)】

热管理 该模块提供热管理相关的接口&#xff0c;包括热档位查询及注册回调等功能。 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shi…

c语言----队列

很久没有写文章了。因为放假了嘛&#xff0c;给自己稍微放松了一下&#xff0c;所以最近的更新很慢。呜呜下一次一定改。然后咧。今天我想与大家分享的是队列。虽然这个知识点我们应该在讲了堆的实现就应该写的&#xff0c;但是后面忘了&#xff0c;以为自己是写了的。但是昨天…

LLM - 词表示和语言模型

一. 词的相似度表示 (1): 用一系列与该词相关的词来表示 (2): 把每个词表示一个独立的符号(one hot) (3): 利用该词上下文的词来表示该词 (3): 建立一个低维度的向量空间&#xff0c;用深度学习方法将该词映射到这个空间里(Word Embedding) 二&#xff1a;语言模型 (1): 根…

基于 STM32 的智能睡眠呼吸监测系统设计

本设计的硬件构成&#xff1a; STM32F103C8T6单片机最小系统板&#xff08;包含3.3V稳压电路时钟晶振电路复位电路&#xff08;上电自复位&#xff0c;手动复位&#xff09;&#xff09;&#xff0c;心率传感器、气压传感器、液晶显示、按键、蜂鸣器、LED灯、蓝牙模块组合而成…

电传动无杆飞机牵引车交付用户

自2019年起&#xff0c;我们计划做电传动控制&#xff0c;先后做了电传动水泥搅拌罐车罐体控制&#xff08;国内首创&#xff09;&#xff0c;初步理解了电机控制的特点。 20-21年接着做了10t飞机牵引车控制&#xff0c;还是电液控制联合的&#xff0c;把越野叉车的行驶控制方…

Prompt的万能公式和优化技巧

文章目录 前言一、万能公式二、优化技巧1.设定角色2.设定目标和动机3.引导主观回答4.预设条件5.做强调6.思维链&#xff08;COT&#xff09;7.巧用定界符 前言 随着LLM的发展&#xff0c;能给我们带来很多方便&#xff0c;但是又引出了一个新的问题就是我们该如何使用他们&…

网络编程:UDP编程笔记

1.字节序的概念和转换 小端格式: 低位字节数据存储在低地址 大端格式: 高位字节数据存储在低地址 在主机上时为小端存储,在网络上时为大端,所以接收到数据时,要转为小端口 如下图: #include <arpa/inet.h> 发送者调用的函数: uint32_t htonl(uint32_t hostlong); //转…

复分析——第8章——共形映射(E.M. Stein R. Shakarchi)

第8章 共形映射(Conformal Mappings) The results I found for polygons can be extended under very general assumptions. I have undertaken this research because it is a step towards a deeper understanding of the mapping problem, for which not much has hap…

SpringBoot 启动流程二

SpringBoot启动流程二 我们首先查看构造方法 SpringApplication 我们发现这个构造方法还是在SpringApplication类里面 这个构造方法还是调用了自身的构造方法 传入了两个参数 第一个参数叫resourceLoader 传入的是一个资源加载器 要从外部读入东西 这个方法通过this关键字…

PhpStorm 2024 for Mac PHP集成开发工具

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff08;适合自己的M芯片版或Intel芯片版&#xff09;&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功3、打开访达&#xff0c;点击【文…

嵌入式底层系统了解

当裸机功能不复杂的时候&#xff0c;即类似与点亮一个LED灯&#xff0c;驱动LCD和OLED这样的模块&#xff0c;以及各位大学生的搭积木式的毕业设计(狗头保命&#xff09;&#xff0c;此时可以简单地分为硬件和软件层&#xff08;应用层),以及以中间层作为中间联系。 当需要实现…

音视频入门基础:H.264专题(7)——FFmpeg源码中 指数哥伦布编码的解码实现

音视频入门基础&#xff1a;H.264专题系列文章&#xff1a; 音视频入门基础&#xff1a;H.264专题&#xff08;1&#xff09;——H.264官方文档下载 音视频入门基础&#xff1a;H.264专题&#xff08;2&#xff09;——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…

【SpringCloud】Ribbon源码解析

ribbon是一个负载均衡组件&#xff0c;它可以将请求分散到多个服务提供者实例中&#xff0c;提高系统的性能和可用性。本章分析ribbon是如何实现负载均衡的 1、LoadBalanced 消费者在引入ribbon组件后&#xff0c;给http客户端添加LoadBalanced注解就可以启用负载均衡功能。Lo…

MATLAB贝叶斯线性回归模型案例

采用辛烷值数据集“spectra_data.mat”(任意数据集均可),介绍贝叶斯线性回归模型的构建和使用流程。 运行结果如下: 训练集预测精度指标如下: 训练集数据的R2为: 1 训练集数据的MAE为: 0.00067884 训练集数据的RMSE为: 0.00088939 测试集预测精度指标如下: 测试集数据的R2…

Python学习之小游戏--坦克大作战

今天跟视频学习了Python实现坦克大作战小游戏&#xff0c;挺有意思的&#xff0c;一起来玩吧~ 按空格发射子弹&#xff0c;上下左右键实现移动&#xff0c;ESC键无限复活。 import pygame,time,random from pygame.sprite import Sprite SCREEN_WIDTH800 SCREEN_HEIGHT500 BG…

如何改善提示词,让 GPT-4 更高效准确地把视频内容整体转换成文章?

&#xff08;注&#xff1a;本文为小报童精选文章。已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费&#xff09; 让我们来讨论一下大语言模型应用中的一个重要原则 ——「欲速则不达」。 作为一个自认为懒惰的人&#xff0c;我一直有一个愿望&#xff1a;完成视频制作…

typescript2-类的类型

/* 输出 吃饭 游泳 */ []( )继承与多态------------------------------------------------------------------------1. 子类继承父类特征子类 extends 父类2. 当需要父类参数传递时&#xff0c;用子类也可以&#xff0c;这就是多态/* 继承&#xff1a;子类继承父类 多态…

集团型企业组织架构复杂,业务线多,如何进行高效费用管控?

企业管理中流行这样一句话&#xff1a;“企业转型&#xff0c;财务先行”。对集团型企业而言&#xff0c;当今的发展形势下&#xff0c;通过财务战略全面转型、最终撬动企业价值提升&#xff0c;是一件难而正确的事情。 集团企业具有经营规模大、产业链多、分支机构多、地域跨度…