Nginx详解(三):ngx_http_rewrite_module模块核心指令详解
概要:
在 Nginx 的众多功能模块中,ngx_http_rewrite_module是实现请求动态处理的核心组件,它通过一系列指令实现 URI 重写、条件判断、响应返回等功能。本文将以 CentOS 7.9 环境为例(主机名www.a.com,IP 172.25.0.100,网站数据目录 /data/sitea/),详细解析break、if、return、rewrite、set五大指令的使用方法,并提供完整的配置验证流程。
环境准备与配置规范
基础环境搭建
在 CentOS 7.9 系统中,首先需要完成 Nginx 的安装与基础配置:
# 安装Nginxsudo yum install -y nginx# 创建网站数据目录sudo mkdir -p /data/sitea/{html,static,mobile,api/v1,api/v2}# 准备测试文件sudo echo "SiteA Home" > /data/sitea/html/index.htmlsudo echo "Mobile Version" > /data/sitea/html/mobile/index.htmlsudo touch /data/sitea/static/style.csssudo echo "API V1" > /data/sitea/api/v1/test.txtsudo echo "API V2" > /data/sitea/api/v2/test.txtsudo echo "API root index" > /data/sitea/api/index.html# 创建虚拟主机配置文件sudo mkdir -p /etc/nginx/conf.d/vhostssudo nano /etc/nginx/conf.d/vhosts/a.com.conf
基础虚拟主机配置
在a.com.conf中添加基础配置:
server {listen 80;server_name www.a.com;root /data/sitea/html;index index.html;location /static/ {root /data/sitea;}location /api/ {root /data/sitea;}
}
环境验证
完成基础配置后,通过以下命令验证环境:
# 检查配置语法nginx -t# 重载Nginx配置nginx -s reload# 测试访问(需在客户端修改hosts文件添加172.25.0.100 www.a.com)curl http://www.a.com# 应返回"SiteA Home"
break 指令:终止请求处理流程
指令语法与作用
break指令用于立即终止当前location或server块内的后续指令执行,不再进行 URI 重写或位置匹配,语法非常简单:
break;
典型应用场景
- 静态资源路径直接响应,避免执行多余逻辑
- 条件判断后提前终止请求处理
实战配置示例
在静态资源路径中添加break指令:
server {listen 80;server_name www.a.com;root /data/sitea/html;index index.html;location /static/ {root /data/sitea;expires 30d;break;invalid_directive;}location /api/ {root /data/sitea;}
}
验证步骤
- 重载 Nginx 配置:reload nginx
- 访问静态资源并查看响应头:
curl -I http://www.a.com/static/style.css
预期输出应包含Expires字段,且由于break指令的存在,该location内的其他错误指令不会影响执行(可故意添加错误指令测试)。
if 指令:条件判断的核心工具
语法与条件类型
if指令通过条件表达式控制请求处理流程,语法为:
if (condition) { ... }
if (condition) { ... }
条件满足时,执行配置块中的配置指令; server, location
condition:
比较操作符:
= 相同 != 不同
~ 模式匹配,区分字符大小写
~* 模式匹配,不区分字符大小写
!~ 模式不匹配,区分字符大小写
!~* 模式不匹配,不区分字符大小写
文件及目录存在性判断:
-e, !-e 存在与否( 包括文件,目录,软链接)
-f, !-f 文件 -d, !-d 目录 -x, !-x 执行
支持的条件类型包括:
- 变量判空:if ($variable)(变量值为空或 "0" 时为假)
- 字符串比较:if ($variable = value) 或 if ($variable != value)
- 正则匹配:if ($variable ~ pattern)(区分大小写)、if ($variable ~* pattern)(不区分大小写)
- 文件检查:if (-f $filename)(文件存在)、if (-d $dirname)(目录存在)等
return 指令:快速返回响应结果
指令语法与功能
return指令用于直接返回 HTTP 状态码和响应内容,终止请求处理,语法为:
return code [text|url];
典型应用场景
- 域名重定向(301/302)
- 禁止特定 IP 访问(403)
- 维护模式返回(503)
应用场景实例
server {listen 80 default_server;server_name www.a.com;root /data/sitea/html;index index.html;access_log /var/log/nginx/access-www.a.com.log main;# 首页:移动端跳转逻辑location = / {if ($http_user_agent ~* "android|iphone") {return 302 /mobile/;}try_files $uri $uri/ /404.html;}# 静态资源location /static/ {root /data/sitea;}# API 路由,并检查 id 参数格式location /api/ {root /data/sitea;set $invalid_id 0;if ($arg_id ~ ".+") {set $invalid_id 1;}if ($arg_id ~ ^\d+$) {set $invalid_id 0;}if ($invalid_id = 1) {return 400 "Invalid ID Format";}}# 移动页面location /mobile/ {root /data/sitea/html;index index.html;}# 其他路径 fallbacklocation / {try_files $uri $uri/ /404.html;}
}
验证方法
curl -I http://www.a.com/ # 应该返回 200 页面为curl http://www.a.com/ # 页面显示“SiteA Home”curl -I -H "User-Agent: iPhone" http://www.a.com/ #跳转移动端页面 返回302curl http://www.a.com/api/?id=abc # 应该返回 400curl http://www.a.com/api/?id=123 # 应该返回 200curl http://www.a.com/mobile/ # 应该返回 index.htmlcurl http://www.a.com/maintenance=1 # 返回500 最终显示404
rewrite 指令:URI 重写的核心能力
rewrite
指令简介
rewrite regex replacement [flag];
-
regex
:正则表达式,用来匹配原始 URI; -
replacement
:用于替换的 URI; -
flag
:可选参数,常用有:-
last
:停止 rewrite,重新进入新的 location 匹配流程; -
break
:停止 rewrite,但不重新匹配 location; -
redirect
:返回 302 临时重定向; -
permanent
:返回 301 永久重定向。
-
应用场景配置
server {listen 80 default_server;server_name www.a.com;root /data/sitea;index index.html index.php;access_log /var/log/nginx/access-www.a.com.log main;######################################## 301/302 Redirect Rewrite######################################## 永久跳转 old-about → about.htmllocation = /old-about {rewrite ^ /about.html permanent;}# 临时跳转 beta → static 页面location = /beta {rewrite ^ /static/beta/index.html redirect;}######################################## break 内部 rewrite######################################## /doc → /static/docs/index.html,地址栏不变location = /doc {rewrite ^ /static/docs/index.html break;}######################################## 首页移动端重定向#######################################location = / {if ($http_user_agent ~* "android|iphone") {return 302 /mobile/index.html;}try_files $uri $uri/ /404.html;}######################################## 静态资源路径#######################################location /static/ {root /data/sitea;}######################################## RESTful API Rewrite#######################################location ~ ^/api/user/(\d+)$ {rewrite ^/api/user/(\d+)$ /api/v1/user.php?id=$1 last;}location ~ ^/api/product/(\d+)/detail$ {rewrite ^/api/product/(\d+)/detail$ /api/v1/product_detail.php?id=$1 last;}location ~ ^/api/order/(\d+)$ {rewrite ^/api/order/(\d+)$ /api/v1/order.php?id=$1 last;}######################################## 通用 API 入口 + 参数校验#######################################location /api/ {root /data/sitea;index index.php;# 参数 id 格式校验set $invalid_id 0;if ($arg_id ~ ".+") {set $invalid_id 1;}if ($arg_id ~ ^\d+$) {set $invalid_id 0;}if ($invalid_id = 1) {return 400 "Invalid ID Format";}try_files $uri $uri/ /404.html;}######################################## 移动页面#######################################location /mobile/ {root /data/sitea/html;index index.html;}######################################## 默认 fallback,支持 .html 补全#######################################location / {try_files $uri $uri.html $uri/ /404.html;}######################################## PHP 处理 via FastCGI#######################################location ~ \.php$ {root /data/sitea;fastcgi_pass unix:/run/php-fpm/www.sock;fastcgi_index index.php;include fastcgi_params;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;}
}
目录结构应如下:
/data/sitea/
├── index.html
├── about.html
├── mobile/index.html
├── static/docs/index.html
├── static/beta/index.html
├── api/v1/user.php
├── api/v1/order.php
└── api/v1/product_detail.php
#php文件自行配置
测试命令:# 301 永久跳转
curl -I http://www.a.com/old-about# 302 临时跳转
curl -I http://www.a.com/beta# break 内部转向
curl http://www.a.com/doc# 自动补 .html
curl http://www.a.com/about# RESTful API
curl http://www.a.com/api/user/123
curl http://www.a.com/api/product/456/detail
curl http://www.a.com/api/order/789
相关文章:

Nginx详解(三):ngx_http_rewrite_module模块核心指令详解
概要: 在 Nginx 的众多功能模块中,ngx_http_rewrite_module是实现请求动态处理的核心组件,它通过一系列指令实现 URI 重写、条件判断、响应返回等功能。本文将以 CentOS 7.9 环境为例(主机名www.a.com,IP 172.25.0.10…...
C++ 建造者模式:简单易懂的设计模式解析
一、引言 在软件开发中,我们经常会遇到一些复杂对象的创建过程,这些对象通常由多个部分组成,并且每个部分的构建过程可能非常复杂。建造者模式(Builder Pattern)就是为了解决这类问题而诞生的一种创建型设计模式。本文将以简单易懂的方式介绍C++中的建造者模式,帮助你理…...

【笔记】在 MSYS2(MINGW64)中正确安装 Poetry 的指南
#工作记录 在 MSYS2(MINGW64)中正确安装 Poetry 的指南 一、背景说明 在 MSYS2(MINGW64)环境中,即使已经安装了 pip,也不建议直接使用 pip install poetry 来安装 Poetry。 这是因为 MSYS2 使用自己的包…...

IDEA项目推送到远程仓库
打开IDEA——>VCS——>Creat Git 选择项目 push提交到本地 创建远程仓库 复制地址 定义远程仓库 推送 推送成功...
DeepSeek 赋能 NFT:数字艺术创作与交易的革新密码
目录 一、NFT:数字世界的独特资产1.1 NFT 的定义与本质1.2 NFT 的价值支撑1.3 NFT 的丰富类型 二、DeepSeek:AI 领域的创新力量2.1 DeepSeek 的发展历程与成就2.2 DeepSeek 的核心技术与能力 三、DeepSeek 在 NFT 创作中的神奇应用3.1 高效生成数字艺术作…...

【后端架构师的发展路线】
后端架构师的发展路线是从基础开发到技术领导的系统性进阶过程,需融合技术深度、架构思维和业务洞察力。以下是基于行业实践的职业发展路径和关键能力模型: 一、职业发展阶梯 初级工程师(1-3年) 核心能力:掌…...

matlab/simulink TLC语法基础练习实例
一、基本语法测试方法 1.新建一个脚本,保存扩展名为tlc,本例中是tst.tlc,设置当前工作路径为保存的tlc文件路径,在tlc文件里面输入下面的代码,然后保存: %warning test 2.在MATLAB的命令窗口输入: tlc …...
MAU算法流程理解
参考文献:湘江船闸的过闸调度算法研究(李 楠,李桂华,尹剑平) (湖南湘江航运建设开发有限公司,湖南 长沙 410011) MAU算法流程 图4展示的是一种船舶排档算法(MAU算法),它…...

蓝桥杯国赛训练 day1
目录 k倍区间 舞狮 交换瓶子 k倍区间 取模后算组合数就行 import java.util.HashMap; import java.util.Map; import java.util.Scanner;public class Main {static Scanner sc new Scanner(System.in);public static void main(String[] args) {solve();}public static vo…...

ESP32之Linux编译环境搭建流程
背景:为了解决 “windows环境中编译ESP32代码速度慢” 的问题,现搭建一个Linux环境,让windows下的VScode连接到Linux环境,VSCode负责编辑代码,虚拟机用于编译代码。 目录 一、安装VMware 1.1 获取VMware安装包 1.2…...
Linux 软件安装方式全解(适用于 CentOS/RHEL 系统)
🐧 Linux 软件安装方式全解(适用于 CentOS/RHEL 系统) 在 Linux 系统中,软件安装方式丰富多样,常见于以下几种方式: 安装方式命令/工具说明软件包管理器(推荐)yum, dnf, apt, zypp…...
QT- QML Layout+anchors 布局+锚点实现窗口部件权重比例分配
布局管理 简单比较两种界面管理锚点布局实现比例布局布局管理实现比例布局循环依赖问题简谈 在日常打螺丝中,我们偶尔会需要实现界面各组件能按比例放置,自适应各种分辨率的需求。我用锚点和布局都实现过相关界面,记录下来两种方式实现的差异…...

UE5打包项目设置Project Settings(打包widows exe安装包)
UE5打包项目Project Settings Edit-Project Settings- Packaging-Ini Section Denylist-Advanced 1:打包 2:高级设置 3:勾选创建压缩包 4:添加要打包地图Map的数量 5:选择要打包的地图Maps 6:Project-Bui…...
Python中os模块详解
Python os 模块详解 os 模块提供了丰富的文件和目录操作、环境变量访问、进程管理等功能,是与操作系统交互的核心模块之一。 基本导入方式 import os常用目录与文件操作 1️⃣ 获取/设置当前工作目录 os.getcwd() # 获取当前工作目录 os.chdir(/tmp) …...

便捷高效能源服务触手可及,能耗监测系统赋能智能建筑与智慧城市
在建筑行业迈向智能化、精细化管理的进程中,传统建筑管理模式因信息割裂、数据利用不足等问题,逐渐难以满足现代建筑复杂的运营需求。楼宇自控系统实现了建筑设备的智能调控,BIM技术则构建了建筑的三维数字化模型,当两者相遇&…...
Kotlin List 操作全面指南
在传统 Java 开发 List 相关的 API 中,有着样板代码冗长、缺乏链式调用、空安全等问题。 Kotlin 这门语言 为 List 提供了丰富的扩展函数,这些函数大大简化了集合操作,解决了传统 Java 集合 API 中的许多痛点。 一、基础操作 1. 创建 List …...
C++--范围for循环详解
范围 for 循环是 C11 引入的语法特性,用于简化遍历容器或数组元素的过程。它比传统 for 循环更简洁安全,特别适合初学者。以下是详细讲解: 基本语法 for (元素类型 变量名 : 容器/数组) {// 循环体(使用变量名访问当前元素&#…...

ISO18436-2 CATII级振动分析师能力矩阵
ISO18436-2021是当前针对针对分析师的一个标准,它对振动分析师的能力和知识体系做了4级分类,这里给出的是一家公司响应ISO18436的CATII级标准,做的一个专题培训的教学大纲。摘自: 【振動噪音產學技術聯盟】04/19-23 ISO 18436-2…...
deepseek问答:torch.full() 函数详解
torch.full() 是 PyTorch 中用于创建指定形状、所有元素值都相同的新张量的核心函数。它在深度学习中有广泛应用,尤其是在初始化张量和创建特殊数据结构时。 函数签名 torch.full(size, fill_value, *, dtypeNone, layouttorch.strided, deviceNone, requires_gra…...

dvwa4——File Inclusion
LOW: 先随便点开一个文件,可以观察到url栏变成这样,说明?page是dvwa当前关卡用来加载文件的参数 http://10.24.8.35/DVWA/vulnerabilities/fi/?pagefile1.php 我们查看源码 ,没有什么过滤,直接尝试访问其他文件 在url栏的pag…...
MYSQL 高级 SQL 技巧
高级 SQL 技巧 以下是一些高级 SQL 技巧,可以帮助优化查询、提高性能并解决复杂的数据处理问题。 使用窗口函数 窗口函数允许在查询结果的行上进行计算,而不会减少行数。常见的窗口函数包括 ROW_NUMBER()、RANK()、DENSE_RANK() 和聚合函数如 SUM() 与…...

Spring Boot养老院管理系统源码分享
概述 基于Spring Boot开发的养老院管理系统,该系统通过智能化管理模块,为养老机构提供高效运营解决方案。 主要内容 后台管理功能 系统后台功能完善,左侧导航栏涵盖首页、安全巡查管理、设备管理等模块。设备管理界面以表格形式清晰展示设…...

go|context源码解析
文章目录 Context接口Deadline()Done()Err()Value() canceler接口ctxemptyCtxcancelCtxtimerCtxvalueCtx 基本使用cancelCtxvalueCtx 首先看一下源码对“context”的描述, When a Context is canceled, all Contexts derived from it are also canceled. 当一个Cont…...

如何在PowerBI中使用Analyze in Excel
如何在PowerBI中使用Analyze in Excel 之前分享过如何使用DAXStudio将PowerBI与Excel连接 ,今天介绍另外一个工具,也可以实现同样的功能,Analyze in Excel。 使用Analyze in Excel 第一步: 首先准备好一个PBIX文件,…...
【学习记录】Element UI导入报错 * element-ui/lib/theme-chalk/index.css in ./src/main.js
文章目录 📌 摘要⚠️ 问题描述🔍 原因分析✅ 正常情况下的依赖结构❗ 问题根源 ✅ 解决方案✅ 方法一:使用 cnpm 安装 Element UI(推荐)步骤 1:全局安装 cnpm(使用淘宝镜像)步骤 2&…...

大模型分布式训练笔记(基于accelerate+deepspeed分布式训练解决方案)
文章目录 一、分布式训练基础与环境配置(1)分布式训练简介(2)如何进行分布式训练(3)分布式训练环境配置 二、数据并行-原理与实战(pytorch框架的nn.DataParallel)1)data …...

鸿蒙UI开发——组件的自适应拉伸
1、概 述 针对常见的开发场景,ArkUI开发框架提供了非常多的自适应布局能力,这些布局可以独立使用,也可多种布局叠加使用。本文针对ArkUI提供的拉伸能力做简单讨论。 拉伸能力是指容器组件尺寸发生变化时,增加或减小的空间全部分…...

鸿蒙仓颉语言开发教程:自定义弹窗
假期第一天,祝大家端午节快乐。昨天观看了时代旗舰尊界S800的发布,不得不感慨这车真好啊~ 放假闲来无事,继续跟大家分享仓颉语言的开发教程,今天介绍一下自定义弹窗。 仓颉语言中的自定义弹窗和ArkTs类似,…...
meilisearch docker 简单安装
ElasticSearch平替 docker run -it -d -p 7700:7700 -v /home/dev/melisearch/meili_data:/meili_data -e MEILI_MASTER_KEYRhTX1pLPSKSn7KW9yf9u_MNKC0v1YKkmx2Sc6qSwbLQ getmeili/meilisearch:v1.13 MEILI_MASTER_KEYRhTX1pLPSKSn7KW9yf9u_MNKC0v1YKkmx2Sc6qSwbLQ …...

Python 数据分析与可视化实战:从数据清洗到图表呈现
目录 一、数据采集与初步探索 二、数据清洗的七种武器 1. 缺失值处理策略 2. 异常值检测与修正 3. 数据类型转换技巧 三、数据转换的魔法工坊 1. 透视表与交叉表 2. 窗口函数实战 3. 文本数据处理 四、可视化呈现的艺术 1. 基础图表进阶用法 2. 高级可视化方案 3.…...