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

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.xdnf.cn/news/17995.html

相关文章:

  • 版本更新!FairGuard-Mac加固工具已上线!
  • win11右键菜单改回win10样式
  • Data Augmentation数据增强
  • EtherCAT概念介绍
  • EchoEar喵伴接入小聆AI,MCP服务轻松体验,智能升级!
  • 低配硬件运行智谱GLM-4.5V视觉语言模型推理服务的方法
  • 如何基于langchain基类LLM自定义大模型
  • 飞算JavaAI开发全流程解析:从自然语言到可运行工程的智能进化
  • 从零开始学Python之数据结构(字符串以及数字)
  • 深入解析 Chrome UI 布局配置的设计思想与实现机制
  • STL算法【常用的算数生成算法】
  • vue3+leaflet案例:告警系统GIS一张图(附源码下载)
  • 基于大语言模型的爬虫数据清洗与结构化
  • 手机实时提取SIM卡打电话的信令声音-整体解决方案规划
  • 《WebGL中FBO的底层运行逻辑》
  • Day57--图论--53. 寻宝(卡码网)
  • 【前端工具】使用 Node.js 脚本实现项目打包后自动压缩
  • 计算机视觉(opencv)实战三——图像运算、cv2.add()、cv2.addWeighted()
  • Docker + Cronicle + Traefik 搭建服务器计划任务工具
  • nginx入门需知(含安装教程)
  • QT+Yolov8 推理部署,ONNX模型 ,实例分割+目标检测
  • 14、Docker Compose 安装 Redis 集群(三主三从)
  • linux 软硬链接详解
  • vscode的wsl环境,ESP32驱动0.96寸oled屏幕
  • 前端包管理工具
  • 基于wireshark的USB 全速硬件抓包工具USB Sniffer Lite的使用
  • 【lucene】DocumentsWriterFlushControl
  • 负载因子(Load Factor) :哈希表(Hash Table)中的一个关键性能指标
  • C++ 滑动窗口、二分查找
  • Ubuntu 22.04 远程桌面设置固定密码的方法