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

如何让Python Requests发送的HTTP请求保持HTTP而非自动转为HTTPS?

问题描述

我正在向http://my-local-server:80/apistuff/user发送POST请求创建用户。调试时确认,直到执行requests.post()之前,URL始终是HTTP协议,但查看Response.url时,它已变成https://my-local-server/apistuff/user——Requests自动将URL转为了HTTPS协议。

这引发了一系列问题:

  • 之前查到的解决方案是在post调用中添加, verify=False参数,但这仅跳过证书验证,无法阻止URL和端口被修改(端口从80变为443)。
  • 应用配置的运行端口为80,代码其他模块依赖该配置。API执行操作后会向配置的URL返回响应,但实际请求从443端口发出,导致API尝试从443(请求来源)向80(目标地址)回调,进而出现308(重定向)、400(错误请求)或500(服务器错误)等不同错误。

核心需求:如何让Requests发送请求时保持HTTP协议,不自动转为HTTPS?

解决方案

1. 直接禁用自动重定向

Requests默认会自动跟随服务器返回的重定向响应,大概率是服务器返回了HTTP转HTTPS的重定向(如301/308永久重定向)导致URL被修改。禁用自动重定向即可保留原HTTP URL和端口:

response = requests.post("http://my-local-server:80/apistuff/user", allow_redirects=False)

2. 修改服务器重定向配置(根源解决)

如果是服务器端强制将HTTP请求重定向到HTTPS,直接修改服务器的重定向规则(比如Nginx、Apache的配置),取消对该接口的HTTP转HTTPS重定向,就能彻底解决问题。

3. 自定义重定向逻辑(按需使用)

如果需要跟随部分重定向但必须保留HTTP协议,可以自定义重定向回调函数,拦截并重写重定向目标URL:

def keep_http_redirect(response, **kwargs):
    # 将重定向目标的HTTPS协议改回HTTP,同时保留原端口80
    if response.next.url.startswith("https://"):
        http_url = response.next.url.replace("https://", "http://")
        # 确保端口是80,避免被自动替换
        if ":80" not in http_url:
            url_parts = http_url.split("/")
            http_url = f"{url_parts[0]}:80/{'/'.join(url_parts[3:])}"
        response.next.url = http_url
    return response

response = requests.post("http://my-local-server:80/apistuff/user", hooks={"response": keep_http_redirect})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 22:47:33