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和代码注释。
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00- QQwen3-Coder-Next2026年2月4日,正式发布的Qwen3-Coder-Next,一款专为编码智能体和本地开发场景设计的开源语言模型。Python00
xw-cli实现国产算力大模型零门槛部署,一键跑通 Qwen、GLM-4.7、Minimax-2.1、DeepSeek-OCR 等模型Go06
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin07
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00