ProxyPin请求重写功能全攻略:URL重定向与参数修改实战
功能概述
ProxyPin是一款开源免费抓包软件,支持全平台系统,使用Flutter框架开发。其请求重写功能允许用户在请求发送到服务器之前或响应返回客户端之前对其进行修改,包括URL重定向、参数修改、头部处理等多种操作。该功能通过lib/network/components/request_rewrite.dart实现核心拦截逻辑,结合lib/network/components/manager/rewrite_rule.dart定义的规则系统,提供灵活强大的请求定制能力。
重写规则类型
ProxyPin提供五种主要重写规则类型,满足不同场景需求:
- 请求替换(RequestReplace):完全替换请求的URL、方法、头部或 body
- 响应替换(ResponseReplace):替换服务器返回的状态码、头部或响应内容
- 请求修改(RequestUpdate):对请求参数、头部进行增删改操作
- 响应修改(ResponseUpdate):修改响应内容或头部信息
- 重定向(Redirect):将请求转发到指定URL
这些规则类型在lib/network/components/manager/rewrite_rule.dart中通过RuleType枚举定义,并对应不同的处理逻辑。
URL重定向实战
基本重定向配置
URL重定向是最常用的功能之一,可将匹配的请求转发到新地址。配置步骤如下:
- 创建重定向规则,设置匹配URL和目标URL
- 启用规则并应用
核心实现代码位于lib/network/components/request_rewrite.dart的getRedirectRule方法:
Future<String?> getRedirectRule(String? url) async {
var manager = await requestRewriteManager;
var rewriteRule = manager.getRewriteRule(url, [RuleType.redirect]);
if (rewriteRule == null) {
return null;
}
var rewriteItems = await manager.getRewriteItems(rewriteRule);
var redirectUrl = rewriteItems?.firstWhereOrNull((element) => element.enabled)?.redirectUrl;
if (rewriteRule.url.contains("*") && redirectUrl?.contains("*") == true) {
String ruleUrl = rewriteRule.url.replaceAll("*", "");
redirectUrl = redirectUrl?.replaceAll("*", url!.replaceAll(ruleUrl, ""));
}
return redirectUrl;
}
通配符重定向
支持使用通配符*实现批量重定向,例如:
- 规则URL:
https://api.example.com/v1/* - 目标URL:
https://api.example.com/v2/*
系统会自动将匹配的部分替换到目标URL中,实现版本升级等场景的无缝迁移。
参数修改技巧
查询参数处理
ProxyPin提供三种参数修改方式:添加、删除和更新,通过RewriteType枚举定义:
static List<RewriteType> updateRequest = [
updateBody,
addQueryParam,
updateQueryParam,
removeQueryParam,
addHeader,
updateHeader,
removeHeader
];
添加参数
case RewriteType.addQueryParam:
queryParameters[item.key!] = item.value;
break;
删除参数
case RewriteType.removeQueryParam:
if (item.value?.trim().isNotEmpty == true) {
var val = queryParameters[item.key!];
if (val == null || !RegExp(item.value!).hasMatch(val)) {
break;
}
}
queryParameters.remove(item.key!);
break;
更新参数
支持正则表达式匹配和替换,实现复杂的参数修改逻辑:
case RewriteType.updateQueryParam:
var entries = Map.of(queryParameters).entries;
var regExp = RegExp(item.key!);
for (var entry in entries) {
var line = "${entry.key}=${entry.value}";
if (regExp.hasMatch(line)) {
line = line.replaceAll(regExp, item.value ?? '');
var pair = line.splitFirst(HttpConstants.equal);
if (pair.first != entry.key) queryParameters.remove(entry.key);
queryParameters[pair.first] = pair.length > 1 ? pair.last : '';
break;
}
}
break;
请求体修改
对于POST请求等包含body的场景,可以使用updateBody类型修改请求内容:
if (item.type == RewriteType.updateBody && message.body != null) {
String body = (await message.decodeBodyString()).replaceAllMapped(RegExp(item.key!), (match) {
if (match.groupCount > 0 && item.value?.contains("\$1") == true) {
return item.value!.replaceAll("\$1", match.group(1)!);
}
return item.value ?? '';
});
message.body = message.charset == 'utf-8' || message.charset == 'utf8' ? utf8.encode(body) : body.codeUnits;
message.headers.remove(HttpHeaders.CONTENT_ENCODING);
message.headers.contentLength = message.body!.length;
}
该功能支持正则表达式替换,特别适合修改JSON或表单数据中的特定字段。
高级应用场景
条件重定向
结合URL匹配和正则表达式,可以实现复杂的条件重定向逻辑。例如,将移动端用户重定向到移动版API:
bool match(String url, {RuleType? type}) {
if (enabled && (type == null || this.type == type)) {
return _urlReg.hasMatch(url);
}
return false;
}
通过自定义正则表达式,可以匹配特定的User-Agent头或其他请求特征,实现智能路由。
响应内容替换
除了请求修改,ProxyPin还支持修改服务器响应。例如,替换API返回的特定字段:
Future<void> responseRewrite(String? url, HttpResponse response) async {
var manager = await RequestRewriteManager.instance;
var rewriteRule = manager.getRewriteRule(url, [RuleType.responseReplace, RuleType.responseUpdate]);
// 响应处理逻辑...
}
这在前端开发中特别有用,可以在不修改后端代码的情况下调整API返回格式或数据。
配置管理
规则存储与加载
重写规则通过JSON格式进行序列化和存储,便于导入导出和共享:
toJson() {
return {
'name': name,
'enabled': enabled,
'url': url,
'type': type.name,
'rewritePath': rewritePath,
};
}
用户可以创建多个规则集,根据不同场景启用或禁用。
优先级管理
当多个规则匹配同一个请求时,ProxyPin会按照规则定义的顺序依次应用。用户可以通过调整规则顺序来控制执行优先级。
常见问题解决
规则不生效
如果配置的重写规则没有生效,请检查:
- 规则是否已启用(
enabled属性为true) - URL匹配模式是否正确,特别是特殊字符是否需要转义
- 是否有更高优先级的规则匹配了该请求
- 查看应用日志,位于lib/network/util/logger.dart定义的日志系统
复杂正则表达式性能
对于包含复杂正则表达式的规则,可能会影响抓包性能。建议:
- 正则表达式尽量精确,避免过度使用通配符
- 对频繁访问的URL单独创建规则,减少不必要的匹配
- 禁用暂时不需要的规则
总结
ProxyPin的请求重写功能为开发者提供了强大的请求定制能力,从简单的参数修改到复杂的条件重定向,满足各种调试和开发需求。通过灵活配置lib/network/components/manager/rewrite_rule.dart中定义的规则类型和lib/network/components/request_rewrite.dart实现的拦截逻辑,用户可以轻松掌控网络请求流程,提高开发效率。
无论是移动应用调试、API版本迁移还是前端开发适配,请求重写功能都能成为您的得力助手。更多高级用法和最佳实践,请参考项目README.md和代码注释。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0151- DDeepSeek-V4-ProDeepSeek-V4-Pro(总参数 1.6 万亿,激活 49B)面向复杂推理和高级编程任务,在代码竞赛、数学推理、Agent 工作流等场景表现优异,性能接近国际前沿闭源模型。Python00
LongCat-Video-Avatar-1.5最新开源LongCat-Video-Avatar 1.5 版本,这是一款经过升级的开源框架,专注于音频驱动人物视频生成的极致实证优化与生产级就绪能力。该版本在 LongCat-Video 基础模型之上构建,可生成高度稳定的商用级虚拟人视频,支持音频-文本转视频(AT2V)、音频-文本-图像转视频(ATI2V)以及视频续播等原生任务,并能无缝兼容单流与多流音频输入。00
auto-devAutoDev 是一个 AI 驱动的辅助编程插件。AutoDev 支持一键生成测试、代码、提交信息等,还能够与您的需求管理系统(例如Jira、Trello、Github Issue 等)直接对接。 在IDE 中,您只需简单点击,AutoDev 会根据您的需求自动为您生成代码。Kotlin03
Intern-S2-PreviewIntern-S2-Preview,这是一款高效的350亿参数科学多模态基础模型。除了常规的参数与数据规模扩展外,Intern-S2-Preview探索了任务扩展:通过提升科学任务的难度、多样性与覆盖范围,进一步释放模型能力。Python00
skillhubopenJiuwen 生态的 Skill 托管与分发开源方案,支持自建与可选 ClawHub 兼容。Python0112