ngx_http_rewrite_module 技术指南

一、核心指令

指令功能概述
rewrite正则匹配并修改 URI,可带 last/break/redirect/permanent 标志
if条件测试,成立时执行花括号内的重写/返回等指令
return立即返回状态码或重定向
set给用户变量赋值
break停止当前层级的重写指令执行
rewrite_log打开重写过程的日志
uninitialized_variable_warn控制未初始化变量访问时的警告

二、执行流程

  1. Server 级:首先执行 http{}server{} 范围内的所有重写模块指令,按配置顺序。
  2. Location 级:依请求 URI 再次匹配 location,执行该层级重写指令。
  3. 循环重写:若 rewrite 修改了 URI,最多重试 10 次上述匹配与执行流程。

三、指令详解与示例

1. rewrite

rewrite <regex> <replacement> [last|break|redirect|permanent];
  • regex:PCRE 正则,用于匹配原始 URI。

  • replacement:可使用 $1..$9 捕获组与内置变量。

  • 标志

    • last:替换后重跑 location 匹配 (相当于内部 redirect)
    • break:只在当前 location 继续执行,不再重匹配
    • redirect:302 临时跳转
    • permanent:301 永久跳转
示例:多种格式重写
# 将 /download/pkg/media/file.ext 重写到 /download/pkg/mp3/file.mp3
rewrite ^(/download/[^/]+)/media/(.+)\.\w+$ $1/mp3/$2.mp3 last;

# 无附加参数时,追加旧 args:
#     /foo?x=1 → /bar?y=2&x=1
rewrite ^/foo$ /bar?y=2 last;

# 若不想携带旧 args,加 ? 切断:
rewrite ^/foo$ /bar?y=2? last;

2. if

if (<condition>) {
    # 支持 rewrite, return, set, break, limit_rate 等指令
}
  • 条件类型

    • 变量真值测试("$var" 为空或“0”视为假)
    • 字符串比较: =, !=
    • 正则匹配: ~, ~*, !~, !~*
    • 文件测试: -f, -d, -e, -x 及其否定
示例:User-Agent 判断与返回
# IE 浏览器定向到专用落地页
if ($http_user_agent ~* "MSIE") {
    rewrite ^/(.*)$ /msie.html break;
}

# 禁止 POST 方法
if ($request_method = POST) {
    return 405 "Method Not Allowed";
}

警告

  • 过度复杂的 if 嵌套会导致混乱与性能问题,官方建议仅做简单条件处理;
  • location 内使用 rewrite … last,须注意可能触发多次重匹配循环。

3. return

# 纯状态码返回
return 404;
# 带正文
return 403 "Access Denied";
# 重定向
return 301 https://$host$request_uri;
# 302 临时跳转(URL 可直接作为单参)
return https://$host/newpath;
  • 关闭连接:使用非标准 444 即可立刻断开,不返回任何头体。

4. set

set $myvar "<value>";
  • 给自定义变量赋 常量、其它变量或它们的拼接,后续可在 rewriteproxy_passreturn 等指令中使用。
if ($http_cookie ~* "uid=([^;]+)") {
    set $uid $1;
}
proxy_pass http://backend/user/$uid;

5. break

  • 等同于在当前上下文结束后不再执行本层剩余 rewrite 指令,但 重启 location 匹配。
location /images/ {
    rewrite ^/images/(.*)\.jpg$ /img/$1.png break;
    # 上面匹配后,不会再执行本 location 的其他 rewrite
}

四、调试与日志

  • 开启重写日志

    rewrite_log on;
    error_log /var/log/nginx/rewrite.log notice;
    

    可在 notice 级别下查到每次重写和 if 条件的执行情况。

  • 禁止未初始化变量警告

    uninitialized_variable_warn off;
    

通过合理使用 ngx_http_rewrite_module,可在 Nginx 层面快速实现 URL 重写、用户分流、访问控制与简易重定向,确保请求到达后端时满足预期路径和参数要求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello.Reader

请我喝杯咖啡吧😊

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值