当前位置: 首页 > news >正文

Nginx学习笔记(九)—— Nginx Rewrite深度解析

🔀🔀 Nginx Rewrite深度解析

📌📌 一、Rewrite核心价值与原理
匹配成功
匹配失败
原始请求
Rewrite规则
执行重写操作
直接访问
新URL/路径
后续处理

核心作用

  • 🔧 URL美化:将复杂动态URL转为静态友好地址
  • 🔀 路径校正:自动补全缺失斜杠或修正大小写
  • 🚚 流量调度:根据条件路由到不同后端服务
  • 🔒 安全加固:隐藏敏感路径参数
  • 📶 访问控制:基于规则拒绝恶意请求
⚙⚙⚙️ 二、Rewrite配置语法

基础指令结构

rewrite regex replacement [flag];

核心参数解析

参数必需描述
regexPerl兼容正则表达式
replacement替换后的目标字符串
flag控制重写行为(详见下表)

标志位详解

Flag作用执行特点
last终止当前location重写用新URI重新搜索location
break终止所有重写在当前location继续执行
redirect302临时重定向浏览器地址栏变化
permanent301永久重定向浏览器缓存重定向
🔧🔧🔧 三、核心指令详解
1️⃣ rewrite指令
location /blog/ {# 将 /blog/123 → /posts?id=123rewrite ^/blog/(\d+)$ /posts?id=$1 last;
}
2️⃣ if条件判断
# 语法:if (condition) { ... }
location / {# 移动设备重定向if ($http_user_agent ~* "mobile|android") {rewrite ^(.*)$ /mobile$1 last;}# 非法IP拦截if ($remote_addr = "202.96.134.33") {return 403;}
}

条件运算符

  • =: 字符串相等
  • !=: 字符串不等
  • ~: 正则匹配(区分大小写)
  • ~*: 正则匹配(不区分大小写)
  • -f: 文件存在
  • -d: 目录存在
3️⃣ set变量设置
location / {set $site_version "v2";# 根据时间设置版本if ($time_hour > 18) {set $site_version "nightly";}rewrite ^/(.*)$ /$site_version/$1;
}
4️⃣ breakreturn控制流
location /api/ {# 终止重写链rewrite ^/api/v1/(.*)$ /legacy/$1 break;rewrite ^/api/v2/(.*)$ /new/$1 break;# 直接返回响应return 200 "API Endpoint";
}
🔄🔄🔄 四、实战配置案例
🌐 案例1:域名标准化
server {listen 80;server_name example.com www.example.com;# 统一主域名if ($host != 'example.com') {rewrite ^(.*)$ https://example.com$1 permanent;}# HTTP转HTTPSif ($scheme = http) {rewrite ^(.*)$ https://$host$1 permanent;}
}
📁 案例2:路径重写
location /ecommerce {# 智能路径重写rewrite ^/ecommerce/product-(\d+)$ /products/$1 last;rewrite ^/ecommerce/category-(.*)$ /categories/$1 last;rewrite ^/ecommerce/(.*)$ /shop/$1 last;
}
🛡 案例3:防盗链实现
location ~* \.(jpg|png|gif)$ {# 允许空Referer和自身域名valid_referers none blocked server_names *.example.com;# 非法引用重写到水印图if ($invalid_referer) {rewrite ^(.*)$ /watermark$1 break;}
}
🔀 案例4:多级路径合并
location /archive {# /archive/2023/05/01 → /posts?date=2023-05-01rewrite ^/archive/(\d+)/(\d+)/(\d+)$ /posts?date=$1-$2-$3 last;# /archive/cat/tech → /category?name=techrewrite ^/archive/cat/(\w+)$ /category?name=$1 last;
}
📊📊 五、全局变量应用

常用内置变量

变量描述应用场景
$args请求参数保留原始参数
$request_uri完整原始URI带参数的完整重定向
$scheme协议类型HTTP/HTTPS转换
$http_user_agent浏览器UA设备适配
$http_referer来源页面防盗链检测
$remote_addr客户端IP访问控制

高级变量应用

location /analytics {# 带参数重定向:/analytics?page=home → /stats/homeif ($args ~* "page=(.*)") {set $page $1;rewrite ^ /stats/$page? last;}# 保留原始参数:/search?q=nginx → /v2/search?q=nginxrewrite ^/search(.*)$ /v2/search$1?$args last;
}
⚠⚠⚠️ 六、高阶技巧与陷阱规避
🔧 技巧1:递归重写控制
location /download {# 最多递归10次rewrite_by_depth 10;# 文件版本清理rewrite "^/(.*)-v\d+\.(.*)$" /$1.$2 last;
}
🎭 技巧2:动态重写映射
# 创建重写映射表
map $uri $new_uri {default          "";~^/old-blog/(.*) /new-blog/$1;~^/shop/(.*)     /ecommerce/$1;
}server {location / {if ($new_uri) {rewrite ^ $new_uri last;}}
}
📶 技巧3:AB测试路由
split_clients $request_uri $variant {50%     "groupA";50%     "groupB";
}location / {rewrite ^/(.*)$ /$variant/$1 last;
}
❌ 常见陷阱解决方案:
  1. 循环重定向问题
# 添加终止条件
location / {if ($request_uri ~ "^/(.*)/$") {set $has_slash on;}if ($has_slash != on) {rewrite ^(.*)$ $1/ permanent;}
}
  1. 正则性能优化
# 优化前(低效)
rewrite ^/([0-9]{4})/([0-9]{2})/([0-9]{2})/(.*)$ /archive/$1$2$3/$4;# 优化后(高效)
rewrite ^/(\d{4})/(\d{2})/(\d{2})/(.+)$ /archive/$1$2$3/$4 last;
  1. 变量未定义错误
# 安全访问变量
if ($arg_id = "") {set $arg_id "default";
}
rewrite ^/(.*)$ /item/$arg_id last;
📊📊 七、调试与监控方案

专用日志格式

log_format rewrite_log '$remote_addr - $request_uri ''-> $uri [$status] ''"$http_user_agent"';server {rewrite_log on;  # 启用重写日志error_log /var/log/nginx/rewrite.log notice;location / {access_log /var/log/nginx/rewrite_access.log rewrite_log;}
}

诊断命令集

# 实时跟踪重写流程
tail -f /var/log/nginx/rewrite.log# 测试重写规则
curl -I http://example.com/test-path# 重写规则语法检查
nginx -t

性能监控

# 统计重写次数
grep -c "rewritten" /var/log/nginx/rewrite.log# 查找最耗时的重写
awk '/rewrite_log/ {print $NF,$7}' access.log | sort -nr

📚📚 总结图谱

Rewrite核心
语法基础
指令系统
应用场景
性能优化
regex/replacement
flag控制
if/set/break
return
路径重写
域名跳转
防盗链
递归控制
映射表
AB测试
http://www.lryc.cn/news/620941.html

相关文章:

  • 学习嵌入式第二十八天
  • python爬虫学习(2)
  • 大模型微调方法讲解
  • linux 软硬链接详解
  • 服务器数据恢复—误删服务器卷数据的数据恢复案例
  • ESXI 6.7服务器时间错乱问题
  • QT+Yolov8 推理部署,ONNX模型 ,实例分割+目标检测
  • 【会员专享数据】2000-2024年我国乡镇的逐日PM₁₀数据(Shp/Excel格式)
  • 6、C 语言指针初阶知识点总结
  • AI搜索优化专家孟庆涛:以技术温度重构“人机信息对话”新范式
  • 前端Vite介绍(现代化前端构建工具,由尤雨溪开发,旨在显著提升开发体验和构建效率)ES模块(ESM)、与传统Webpack对比、Rollup打包
  • 飞算JavaAI合并项目实战:7天完成3年遗留系统重构
  • 92、23种设计模式-单例模式
  • LeetCode 面试经典 150_数组/字符串_最后一个单词的长度(19_58_C++_简单)(反向遍历)
  • vector 认识及使用
  • MTK平台Wi-Fi学习--如何修改wifi 的TX Power
  • 计算机毕设大数据选题推荐 基于spark+Hadoop+python的贵州茅台股票数据分析系统【源码+文档+调试】
  • STL——容器——容器适配器
  • Mac chrome浏览器下载DevEco Studio 6.0.0 Beta2失败
  • MacOS 系统计算机专业好用工具安装
  • Spring Boot 深度解析:从原理到实践
  • 亚马逊手工制品分类体系革新:从流量重构到运营升级的深度解析
  • [已解决]当启动 Spring Boot 应用时出现 Using generated security password xxx提示
  • Rust Web框架Axum学习指南之入门初体验
  • vue部署正式环境上传nginx后遇到的问题
  • MySQL中的DML(二)
  • mysql查询中的filesort是指什么
  • 第三方软件检测:软件性能测试报告(一)
  • CMake笔记:Alias Target在哪些地方可以使用
  • 使用Docker安装MeiliSearch搜索引擎