DEBUG.WIKI
野草云;香港 200Mbps 峰值;不限月流量 · BGP VPS;查看套餐 →
晚安云;香港 CN2 ¥15/月
PanstarCloud:部署应用,接入 AI,云服务器与 AI 网关

aiohttp 设置 max_redirects=0 后仍跳转,怎样真正禁止重定向

aiohttp 的 max_redirects=0 表示不设次数上限。要停在首个响应应使用 allow_redirects=False,并把跟随策略、次数和时间预算分别验收。

把 aiohttp 的 max_redirects 设为 0,本想停在第一跳,遇到重定向循环却一直请求到超时。应改用 allow_redirects=False;在 aiohttp 3.14.5 的正式实现和接口说明中,0 表示不设重定向次数上限。

内部判断是 if max_redirects and redirects >= max_redirects。0 不满足前一项,次数检查不会触发。它不是“最多允许零次”的开关,也不应该用来保护可能陷入循环的客户端。

要读取第一跳,关闭自动跟随

下面是已有异步业务入口中的配置示例。session 为项目管理生命周期的 ClientSession,url 必须是获准访问的地址:

import aiohttp

async with session.get(
    url,
    allow_redirects=False,
    timeout=aiohttp.ClientTimeout(total=10),
) as response:
    status = response.status
    location = response.headers.get("Location")

这样得到的是原响应。10 秒只是示例总预算,应按项目要求调整,不代表通用网络超时标准。异步上下文会负责退出时释放响应;真实代码还应按接口约定读取需要的正文。

看到 301、302、303、307 或 308 后,可以由应用决定是否处理 Location。不要顺手调用第二次请求再声称“没有跟随”;如果要手工跟随,还要解析相对地址、重新判断允许的主机与协议、处理方法和请求体,并保留次数及总时间边界。带凭据或访问内网的客户端尤其不能把任意 Location 当成可信目标。

需要少量跳转时,给正数上限和时间预算

允许自动跳转的调用可以明确 allow_redirects=True 与有限的正数 max_redirects,并捕获项目需要处理的 aiohttp.TooManyRedirects。时间预算仍有独立用途:每一跳本身可能很慢,次数上限不限制单跳耗时。

这个计数在遇到重定向响应时递增,并可能在跟随下一地址前抛出异常。对“恰好允许几次”的要求,应在自己使用的正式版本里覆盖边界用例,不能把 1 当成关闭跟随的等价写法。

不同方法的默认跟随行为也要核对。比如 head() 与 get() 的默认值不同;依赖默认值切换方法后,容易误以为配置没有生效。对有明确策略的客户端,直接给出 allow_redirects 更便于审查。

用受控测试服务检查首跳、正常链与循环链:关闭跟随时应只有首个响应且 history 为空;允许有限跳转时,越界应进入约定的异常处理。不要拿不受控的公开循环地址反复压测,也不要为了结束等待取消全部超时或吞掉所有异常。该参数处理不需要关闭 TLS 验证,不能把证书错误和重定向策略混在一起解决。