You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mitmproxy配置上游代理服务器报错SetServerNotAllowedException求助

解决Mitmproxy设置上游代理时的SetServerNotAllowedException异常

问题分析

你碰到的SetServerNotAllowedException,核心原因是修改上游代理的时机不对。从你贴的代码来看,你在request事件里尝试修改上游,但此时请求已经处于live状态(也就是已经和服务器建立了连接),这时候mitmproxy不允许再切换上游服务器,自然就抛出了异常。

解决方案

我们需要把上游代理的修改逻辑移到请求连接建立的早期阶段,也就是用clientconnect事件来处理,这个阶段还没和目标服务器/上游代理建立连接,是修改上游的安全时机。另外还要注意妥善处理HTTPS的CONNECT请求。

修正后的代码

import mitmproxy
from mitmproxy import ctx

def clientconnect(flow):
    # 为所有客户端连接设置统一上游代理
    upstream_proxy = ("92.247.125.246", 3128)
    flow.server_conn.change_upstream_proxy_server(upstream_proxy)
    ctx.log.info(f"已切换上游代理至: {upstream_proxy}")

def request(flow):
    # 保留你原来的请求主机打印逻辑,跳过CONNECT请求避免冗余输出
    if flow.request.method != "CONNECT":
        ctx.log.info(f"当前请求主机: {flow.request.host}")

关键修改点说明

  • 改用clientconnect事件:这个事件在客户端刚连上mitmproxy时触发,此时还未建立任何下游连接,完全允许修改上游代理配置。
  • 调用flow.server_conn.change_upstream_proxy_server():替换原来的flow.live相关方法,server_conn是专门管理服务器连接的对象,在这个阶段操作完全合规。
  • 优化请求日志逻辑:把打印请求主机的逻辑留在request事件里,同时跳过CONNECT请求,避免日志里出现大量隧道建立的冗余信息。

额外注意事项

  • 先确认你的上游代理92.247.125.246:3128是可用的,并且支持转发HTTP和HTTPS请求(包括CONNECT隧道)。
  • 如果你之前禁用了HTTPS证书检查,记得把mitmproxy的根证书安装到浏览器里,不然会出现证书信任错误,影响请求正常转发。
  • 要是需要针对特定域名设置不同上游代理,可以在clientconnect事件里加条件判断,比如:
    def clientconnect(flow):
        if "target-domain.com" in flow.request.host:
            flow.server_conn.change_upstream_proxy_server(("special-proxy.com", 3128))
        else:
            flow.server_conn.change_upstream_proxy_server(("92.247.125.246", 3128))
    

内容的提问来源于stack exchange,提问作者KaronatoR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:06:28