当前位置: 首页 > 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.dtcms.com/a/330685.html

相关文章:

  • C++ STL学习 之 泛型编程
  • Unity Shader unity文档学习笔记(十九):粘土效果,任意网格转化成一个球(顶点动画,曲面着色器)
  • 算法提升之树上问题-(LCA)
  • vue3使用leaflet地图
  • **超融合架构中的发散创新:探索现代编程语言的挑战与机遇**一、引言随着数字化时代的快速发展,超融合架构已成为IT领域的一种重要趋势
  • 【入门级-算法-2、入门算法:枚举法】
  • 代码随想录Day50:图论(图论理论、深度搜索理论、所有可达路径、广度搜索理论)
  • 表单输入绑定详解
  • 给电脑升级内存,自检太慢,以为出错
  • FPS游戏时,你的电脑都在干什么(CS2)
  • langchain入门笔记03:使用fastapi部署本地大模型后端接口,优化局域网内的问答响应速度
  • 网页加载缓慢系统排查与优化指南
  • 消费级显卡分布式智能体协同:构建高性价比医疗AI互动智能体的理论与实践路径
  • npm介绍,指令合集,换源指令
  • 【大文件上传】分片上传+断点续传+Worker线程计算Hash
  • Bean的生命周期
  • (2-10-1)MyBatis的基础与基本使用
  • 【word】一次选中全部表格,宏方法
  • [工具]vscode 使用AI 优化代码
  • week1-[分支结构]中位数
  • AI技术产品化:核心认知与实战指南
  • 【深度学习计算性能】04:硬件
  • 集成电路学习:什么是Machine Learning机器学习
  • 云原生存储架构设计与性能优化
  • 自动驾驶轨迹规划算法——Apollo OpenSpace Planner
  • 利用GISBox完成超图S3M与OSGB三维模型格式的转换
  • Elasticsearch 中如何配置 RBAC 权限-实现安全的访问控制
  • 现在都是APP,小程序抢购,支持浏览器不支持 SSE
  • GPT-5 提示词优化全攻略:用 Prompt Optimizer 快速迁移与提升,打造更稳更快的智能应用
  • LeetCode——Hot 100【合并区间 最大子数组和】