本文首发于 栏轩·阁欢迎访问阅读原文获取更好的阅读体验。一、URL Rewrite 是什么为什么需要它URL RewriteURL 重写是 Nginx 的核心功能之一它允许你在请求到达服务器时动态地修改请求的 URL而不改变用户浏览器地址栏中显示的链接或者根据需要改变。核心价值SEO 优化将?page2id123这样的动态参数 URL 转换为/page/2/id/123.html的静态化 URL搜索引擎更喜欢后者用户体验简洁、有语义的 URL 更容易被用户理解和记忆安全隐藏真实的请求参数和目录结构避免暴露技术细节兼容性网站改版时将旧链接 301 重定向到新链接保证 SEO 权重不丢失二、一个典型场景动态页面伪装成静态 HTML需求原始页面/good?page2希望用户访问/good/2.html就能看到同样的内容这样做的好处隐藏真实参数不暴露?page这样的查询字符串伪装成静态 HTML搜索引擎和用户都更偏好静态化的 URL更利于 SEO搜索引擎对静态 URL 的索引和排名更友好完整配置实现server { listen 80; server_name example.com; # 用户访问 /good/2.html 时内部重写为 /good?page2 location / { rewrite ^/good/(\d)\.html$ /good?page$1 last; } # 实际处理请求的 location location /good { # 这里是正常的业务逻辑 proxy_pass http://backend; # 或者 try_files 等 } }配置逐行解析配置说明rewriteNginx 重写指令^/good/(\d)\.html$正则表达式匹配类似/good/2.html的链接(\d)捕获数字部分/good?page$1替换后的 URL$1引用第一个捕获的分组即数字 2lastflag 标记表示完成重写后用新 URL 重新匹配 location三、Rewrite 统一语法基本语法rewrite regex replacement [flag];部分说明regex正则表达式匹配用户请求的 URIreplacement替换后的 URI可以引用正则捕获的变量$1、$2等flag可选控制重写后的行为方式Rewrite 指令的作用位置rewrite 可以出现在以下两个上下文中server块— 在 server 级别对所有请求生效location块— 仅对匹配该 location 的请求生效if块— 结合条件判断使用# 在 server 块中全局生效 server { rewrite ^/old-path/(.*)$ /new-path/$1 permanent; } # 在 location 块中对特定路径生效 location /images { rewrite ^/images/(.*)$ /assets/$1 break; }四、四大 Flag 标记详解Flag 是 rewrite 指令的关键部分决定了重写后 Nginx 的行为方式。Flag行为适用场景是否改变浏览器 URLlast重写后重新搜索location 匹配在 location 块中使用需要重新匹配时❌ 内部重写break重写后停止rewrite 模块的处理但不重新匹配 location当前 location 已经匹配正确只需重写 URI 即可❌ 内部重写redirect返回302 临时重定向临时性的 URL 变更✅ 浏览器地址变化permanent返回301 永久重定向永久性的 URL 变更、网站改版✅ 浏览器地址变化如何选择一张图看懂用户请求 URL │ ▼ rewrite 匹配成功 │ ├── flag last → 用新 URI 重新匹配 location内部跳转URL 不变 ├── flag break → 用新 URI 继续当前请求不重新匹配URL 不变 ├── flag redirect → 返回 302告诉浏览器换地址URL 会变 └── flag permanent → 返回 301永久迁移URL 会变搜索引擎更新索引示例last vs break 的区别location /a/ { rewrite ^/a/(.*)$ /b/$1 last; } location /b/ { rewrite ^/b/(.*)$ /c/$1 last; }请求/a/foo→ 第一次 rewrite 为/b/foolast触发重新匹配 → 进入location /b/→ 第二次 rewrite 为/c/foo如果用break替换上面的last请求/a/foo→ rewrite 为/b/foo但break不重新匹配 → 直接处理/b/foo不会执行location /b/中的 rewrite301 vs 302 的选择场景推荐网站永久迁移到新域名permanent301旧链接永久更换为新格式permanent301临时维护页面redirect302A/B 测试流量分发redirect302不确定是否永久改动redirect302六、实战案例详解案例 1文章 ID 美化需求/article.php?id123→/article/123.htmllocation / { rewrite ^/article/(\d)\.html$ /article.php?id$1 last; }案例 2多参数传递需求/list?cattechpage2→/list/tech/2.htmllocation / { rewrite ^/list/(\w)/(\d)\.html$ /list?cat$1page$2 last; }案例 3分类文章名WordPress 风格需求/post?slughello-world→/2024/01/hello-world.htmllocation / { rewrite ^/(\d{4})/(\d{2})/([\w-])\.html$ /post?year$1month$2slug$3 last; }案例 4域名跳转301 永久重定向需求旧域名old-site.com全部跳转到new-site.comserver { listen 80; server_name old-site.com www.old-site.com; rewrite ^(.*)$ http://new-site.com$1 permanent; } # 更推荐用 return 301性能更好 server { listen 80; server_name old-site.com www.old-site.com; return 301 http://new-site.com$request_uri; }案例 5强制 HTTPSserver { listen 80; server_name example.com; rewrite ^(.*)$ https://$host$1 permanent; # 或用 return更高效 # return 301 https://$host$request_uri; } server { listen 443 ssl; server_name example.com; # 正常的 HTTPS 配置 }五、常见问题与注意事项1. Rewrite 与 Return 的选择return比rewrite性能更好因为它直接中断请求处理不经过正则匹配。能用return的场景优先用return# ✅ 推荐return 301 return 301 https://$host$request_uri; # ❌ 不推荐rewrite ... permanent rewrite ^(.*)$ https://$host$1 permanent;2. 注意死循环# ❌ 错误示例会陷入无限循环 location / { rewrite ^/article/(\d)$ /article/$1 last; }因为 rewrite 后重新匹配 location又匹配到/这个 location再次触发 rewrite。解决方法使用break或将具体规则放在更精确的 location 中。3. Proxy_Pass 下的 Rewrite 顺序当同时使用 proxy_pass 和 rewrite 时rewrite 在 proxy_pass 之前执行。可以先在 location 中 rewrite 修改 URI再 proxy_pass 转发。举个例子有个后端接口接收/api/user?id123但你想让用户访问/user/123就能调用它location / { rewrite ^/user/(\d)$ /api/user?id$1 break; proxy_pass http://backend_server; }执行流程用户访问/user/123rewrite先把 URI 改为/api/user?id123然后proxy_pass将修改后的请求转发给后端再看一个实际场景前端静态资源和后端 API 混用server { listen 80; server_name blog.example.com; location / { # 先尝试读取静态文件没有命中才 rewrite root /var/www/static; } location /api/ { # 把 /api/article/42 重写为 /index.php?routearticleid42 rewrite ^/api/(\w)/(\d)$ /index.php?route$1id$2 break; proxy_pass http://php_backend:9000; } }访问/api/article/42时rewrite先将路径重写为/index.php?routearticleid42然后proxy_pass将重写后的请求转发给 PHP 后端处理4. 调试 Rewrite 规则启用 rewrite 日志方便调试server { # 开启 rewrite 日志 rewrite_log on; error_log /var/log/nginx/rewrite_error.log notice; }在错误日志中可以看到每个 rewrite 的执行步骤非常有助于排查问题。六、总结关键点要点语法rewrite regex replacement [flag]四个 flaglast重匹配、break停止、redirect302、permanent301正则捕获()捕获$1、$2引用性能单纯的重定向用return而不是rewrite调试开启rewrite_log on查看重写过程SEO301 传递权重302 不传递按场景选择URL Rewrite 是 Nginx 配置中最常用也最强大的功能之一掌握了它你就能随心所欲地控制网站的 URL 结构让链接既美观又对搜索引擎友好。
企业数字化 ERP 产品动态
相关推荐
5个与众不同的消息鉴别算法的设计与分析 5个与众不同的消息鉴别算法的设计与分析
下面给出 5 个概念性消息鉴别算法(MAC)设计草图。它们追求风格迥异、创意优先,但必须强调:这些设计未经过公开密码分析,不能直接用于生产系统。生产环境应优先使用 HMAC-SHA-3、KMAC、BLAKE3-MAC 等标准方案。以下统一约定: K:共… · 2026/9/26 4:04:02
NeuroImage:脑脊液与全脑信号耦合的昼夜变化 本篇文献发表在NeuroImage杂志。所发布内容旨在与大家分享学术新知,促进交流学习,版权归原作者或原出处所有,感谢各位学者的辛勤付出与研究成果。引言类淋巴系统被提出作为促进代谢废物产物(包括淀粉样蛋白--β和其他溶质… · 2026/9/26 4:04:02
BES2600烧录工具V1.46实战:TWS耳机固件烧录与排错 简介:面向BES2300、BES2500、BES2600系列芯片开发者,这份Windows平台烧录工具V1.46版聚焦物联网、智能家居、工业自动化场景中的固件上传、调试与产线烧录需求,可显著提升固件加载效率与成功率。压缩包共105个文件,大小约12.03MB&… · 2026/9/26 4:46:03
图像数据与GPU显存管理:从数据加载到优化实战 要说深度学习圈子里最经典的“玄学”,显存不够用肯定能排进前三。训练个图像分类模型,数据刚加载完就报CUDA out of memory;想加大batch size让训练更稳,结果显存直接爆掉;好不容易把环境配好,笔记本上明明… · 2026/9/26 4:46:03
STVP烧录工具实战指南:从命令行批处理到产线避坑 简介:STVP烧录工具ST Visual Programmer.rar是面向嵌入式开发者的ST单片机程序烧录软件资源包。该资源围绕ST-LINK调试器与STVP软件环境,适用于需要对STM32、ST7等系列芯片进行Flash编程与调试的场景。包内除STVP主程序svp.exe外,还提供ST-LI… · 2026/9/26 4:46:03
D3QN驱动的MEC动态资源调度:面向5G边缘AI的毫秒级决策方案 简介:本资源是一套面向人工智能与边缘计算方向本科生、研究生的毕业设计/课程设计实战代码包,聚焦移动边缘计算(MEC)场景下的计算卸载决策与资源动态分配问题,采用深度强化学习(DRL)中的深度Q网… · 2026/9/26 4:46:03
虚拟机死循环重启排查与修复全攻略 相信每一个玩虚拟机的朋友都经历过那种令人抓狂的时刻:虚拟机一开机,还没进入桌面,就自动重启,反复循环,像中了邪一样。尤其是当你手头有重要工作,或者刚配好一个复杂的开发环境还没来得及快照的时候&#… · 2026/9/26 4:45:57
Unity 2D弹幕射击游戏复现指南:从基础移动到对象池优化实践 简介:面向Unity 2D开发者的“雷霆战机”演示工程资源,适合刚入门游戏开发的学生或独立开发者学习弹幕射击玩法的完整实现。压缩包内共1740个文件,以DLL插件、Unity场景与脚本、材质球(mat)、预设体(prefab&… · 2026/9/26 4:45:57
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践 一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46