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

Nginx URL Rewrite:灵活的 URL 重写与重定向

URL 重写(Rewrite)

Nginx 的 **URL 重写(Rewrite)**功能允许你根据请求的 URL 动态地修改请求路径或进行重定向。通过 URL 重写,你可以实现诸如:

  • 友好 URL:将复杂的 URL 转换为简洁、易记的形式。
  • 301/302 重定向:实现页面永久或临时重定向。
  • 条件重写:基于不同的条件(如请求头、IP 地址、用户代理等)修改请求路径。

本文将详细介绍如何在 Nginx 中实现 URL 重写,并给出一些常见的实际场景。

Nginx 中的 URL 重写指令

Nginx 中的 URL 重写主要依赖于两个指令:

  • rewrite:用于修改请求的 URL。
  • try_files:尝试一系列的文件路径,并在文件不存在时重写 URL。
rewrite 指令

rewrite 指令允许你根据正则表达式重写 URL。其基本语法如下:

rewrite <匹配规则> <重写目标> [标志];
  • 匹配规则:正则表达式,匹配请求的 URL。

  • 重写目标:新的 URL,符合规则时,Nginx 会将请求的 URL 重写为这个目标。

  • 标志(可选):控制重写的行为,常见的标志有:

    • last:表示重新搜索新的 location 块(即继续匹配新的规则)。

    • break:停止当前 location 块中的规则匹配,执行后续指令。

    • redirect:执行临时重定向(302)。

    • permanent:执行永久重定向(301)。

这里举个例子:

rewrite ^/archive/(d{4})/(d{2})/(d{2})$ /archive?year=$1&month=$2&day=$3 last;

可以分解为:

  • ^/archive/(d{4})/(d{2})/(d{2})$:这是一个正则表达式,表示匹配/archive/后跟着年份、月份和日期的 URL。具体匹配:
    • ^表示匹配 URL 的开始;
    • /archive/是固定的路径部分;
    • (d{4})匹配 4 位数字(年份);
    • (d{2})匹配 2 位数字(月份);
    • (d{2})匹配 2 位数字(日期);
    • $表示匹配 URL 的结尾。
  • /archive?year=$1&month=$2&day=$3:这是重写后的目标 URL。这里使用了捕获组的替换:
    • $1被替换为第一个捕获组(即年份)。
    • $2被替换为第二个捕获组(即月份)。
    • $3被替换为第三个捕获组(即日期)。
    • 最终重写的 URL 是/archive?year=2024&month=03&day=25
  • last:这个标志表示 Nginx 会停止当前的rewrite匹配,并继续重新匹配请求的新 URL(即/archive?year=2024&month=03&day=25)。

首先来看这部分正则表达式:(d{4})/(d{2})/(d{2})

  • (d{4})
    • d是一个正则表达式元字符,表示匹配数字字符,即 0-9 的任意数字。
    • {4}是量词,表示前面的表达式(这里是d)必须出现4 次
    • 因此,(d{4})匹配4 位数字,通常用来表示年份(比如 2024)。
  • /(d{2})
    • 同理,(d{2})匹配2 位数字,通常用来表示月份(如03)或日期(如25)。
    • 这里的d{2}匹配的是 2 个数字,表示月份或日期。
  • /(d{2})
    • 这个部分与上面相同,匹配的是2 位数字,通常表示日期部分。

综合起来:

(d{4})/(d{2})/(d{2})就是用来匹配像/2024/03/25这样的 URL,具体来说:

  • 第一部分(d{4})匹配年份部分(例如 2024)。
  • 第二部分(d{2})匹配月份部分(例如 03)。
  • 第三部分(d{2})匹配日期部分(例如 25)。

()作用:

括号()用来捕获匹配的内容。捕获的内容可以通过$1,$2,$3来引用。这是正则表达式中的“捕获组”(capture groups)。

在示例中,(d{4})(d{2})(d{2})就是捕获组,分别捕获年份、月份和日期。

$1$2$3是什么意思?

在正则表达式中,捕获组(即()中匹配的内容)会按顺序赋予数字标识。

  • $1:引用第一个捕获组(这里是(d{4})),即年份部分。
  • $2:引用第二个捕获组(这里是(d{2})),即月份部分。
  • $3:引用第三个捕获组(这里是(d{2})),即日期部分。

假设请求的 URL 是/archive/2024/03/25,在rewrite指令中,(d{4})将捕获到2024(d{2})捕获到03,另一个(d{2})捕获到25

  • $1就是2024(第一个捕获组)。
  • $2就是03(第二个捕获组)。
  • $3就是25(第三个捕获组)。
try_files 指令

try_files 用于检查一系列文件是否存在,如果文件存在则继续处理,否则进行 URL 重写。它常用于静态资源的处理,例如检查文件是否存在,如果不存在,则重写请求到某个页面(通常是首页或错误页面)。

try_files <文件1> <文件2> ... <重写目标>;

常见的 URL 重写场景

实现 301/302 重定向

当你需要将旧 URL 重定向到新 URL 时,rewrite指令非常有用。301 是永久重定向,告诉搜索引擎这个页面已经被永久移动;302 是临时重定向,表示页面将暂时被移动到新的 URL。

示例:将http://example.com/old-page重定向到http://example.com/new-page

server { listen 80; server_name example.com; location /old-page { rewrite ^/old-page$ /new-page permanent; } location /new-page { # 处理新页面的配置 } }

配置解释:

  • rewrite ^/old-page$ /new-page permanent;:将/old-page重定向到/new-page,并使用永久重定向(301)。
  • permanent标志表示这是一个永久性重定向。
将非 www 域名重定向到 www 域名

如果你希望所有请求都通过www.example.com访问,可以使用 Nginx 重定向非 www 域名的请求。

示例:将example.com重定向到www.example.com

server { listen 80; server_name example.com; # 进行 301 重定向 return 301 http://www.example.com$request_uri; } server { listen 80; server_name www.example.com; location / { # 正常的站点配置 } }

配置解释:

  • return 301 http://www.example.com$request_uri;:将所有example.com的请求重定向到www.example.com,并保留请求的 URI。
URL 正则重写:简化 URL 结构

你可以使用正则表达式对 URL 进行重写,使 URL 更加简洁、符合 SEO 标准。

示例:将/category/id/123重写为/category/123

server { listen 80; server_name example.com; location /category/id/ { rewrite ^/category/id/(d+)$ /category/$1 last; } }

配置解释:

  • rewrite ^/category/id/(d+)$ /category/$1 last;:将/category/id/123重写为/category/123,并使用last标志继续匹配新的location块。
动态 URL 重写:参数化查询

如果你的网站 URL 需要支持动态查询参数,可以使用rewrite指令根据 URL 参数进行重写。

示例:将/search?q=keyword重写为/search/keyword

server { listen 80; server_name example.com; location /search { rewrite ^/search?q=(w+)$ /search/$1 last; } }

配置解释:

  • rewrite ^/search?q=(w+)$ /search/$1 last;:将/search?q=keyword重写为/search/keyword,并使用last标志继续匹配新的location块。
404 页面重定向

当请求的文件或页面不存在时,你可能希望将请求重定向到一个自定义的 404 页面或者首页。可以通过try_files指令实现。

示例:当请求的文件不存在时,重定向到index.html

server { listen 80; server_name example.com; location / { try_files $uri $uri/ /index.html; } }

配置解释:

  • try_files $uri $uri/ /index.html;:Nginx 将首先检查请求的文件是否存在,如果不存在,则将请求重写为/index.html
结合正则表达式进行动态 URL 重写

Nginx 支持强大的正则表达式匹配功能,可以用来处理更复杂的 URL 重写需求。以下是一个更复杂的 URL 重写示例,结合条件和正则表达式来进行动态路由。

示例:根据日期重写 URL

server { listen 80; server_name example.com; location /archive/ { rewrite ^/archive/(d{4})/(d{2})/(d{2})$ /archive?year=$1&month=$2&day=$3 last; } }

配置解释:

  • rewrite ^/archive/(d{4})/(d{2})/(d{2})$ /archive?year=$1&month=$2&day=$3 last;:将/archive/2024/03/25重写为/archive?year=2024&month=03&day=25
http://www.jsqmd.com/news/466869/

相关文章:

  • 从CMake到可执行文件:图解现代C++项目的完整构建流程(Windows/Linux双平台演示)
  • AI绘画工具推荐:LiuJuan20260223Zimage,一键生成多种风格LiuJuan主题图片
  • G-Helper效能优化指南:华硕笔记本硬件控制与性能提升方案
  • 2026住宅地产行业石英石花纹板优质品牌推荐:岩石力/岩石力石英石/石英石/选择指南 - 优质品牌商家
  • 发现 Navicat 正式免费:跟不上了
  • TB6612FNG电机驱动模块:高效双路直流电机控制与Arduino实战指南
  • 突破网盘限速困境:直链下载工具如何重塑文件获取效率
  • 2026最新湖南/长沙秩序维护推荐!物业小区/巡逻/临时保安/工业园/医院安保权威榜单 - 十大品牌榜
  • GME-Qwen2-VL-2B开源镜像详解:动态图像分辨率支持原理与实测边界
  • 开源系统部署工具:突破硬件限制的全流程解决方案
  • ESP32-S3 MCPWM深度解析:时序引擎与电机驱动工程实践
  • YOLOv8鹰眼检测应用案例:工厂安全帽佩戴实时监控方案
  • 重构硬件管理逻辑:开源工具如何让游戏本性能释放更精准
  • ALOHA:突破双臂机器人技术壁垒的开源革新方案
  • 让旧Mac重获新生:OpenCore Legacy Patcher实现系统升级的完整指南
  • Fish Speech 1.5GPU算力优化:显存占用控制与推理速度提升技巧
  • Qwen3-TTS-Tokenizer-12Hz入门必看:tokens文件SHA256校验与完整性验证方法
  • 告别侵权风险:2026年十大高清免费图片素材网站推荐,商用版权可下载合集 - 品牌2026
  • Guohua Diffusion 生成建筑效果图实战:参数详解与风格控制
  • 异步流吞吐量暴跌40%?C# 13中await foreach隐式取消上下文的3种静默失效场景,90%团队已中招!
  • Swin2SR性能对比测试:与传统超分算法的优劣分析
  • UW数据科学就业攻略:蒸汽教育助力亚马逊微软入职 - 博客湾
  • Tesla-Menu革新性工具全场景应用指南:效率提升与跨场景解决方案
  • 实时口罩检测-通用效果展示:多张人脸同时识别,准确率实测分享
  • AI训练素材供应商推荐,AI训练图片视频数据集供应商一站式优选 - 品牌2026
  • 为什么你的C# OPC UA客户端在WinServer 2022上频繁断连?微软补丁级修复方案(含源码级心跳重连引擎)
  • Nunchaku FLUX.1-dev参数详解:LoRA融合策略对生成质量影响
  • ai辅助开发:让快马ai帮你智能诊断和优化wsl2 ubuntu22.04性能问题
  • OpenCore Legacy Patcher:让老旧Mac重获新生的技术方案
  • OWL ADVENTURE模型部署避坑指南:解决403 Forbidden等常见网络错误