结论先说: HTTP 407 Proxy Authentication Required 表示代理服务器拒绝了你的请求,因为没有收到正确的用户名和密码。请求根本没有到达网站,问题出在你的应用和代理之间。最常见的原因有三种:账号密码填错;工具没有把账号密码发出去;代理地址里的特殊字符没有转义。从代理控制台重新复制用户名和密码,转义特殊字符,并确认工具支持代理认证,大多数 407 就能解决。

407 错误是什么意思
需要登录的代理会检查每个请求有没有 Proxy-Authorization 请求头。没有或账号密码不对,代理就返回状态码 407,并用 Proxy-Authenticate 请求头告诉你它接受的登录方式,通常是 Basic。应用收到后应该带上正确的账号密码重试;没有账号密码或账号密码错误时,你看到的就是 407。
有三个状态码容易混淆:
| 状态码 | 谁返回的 | 含义 | 该检查什么 |
|---|---|---|---|
| 407 Proxy Authentication Required | 代理 | 代理的账号密码缺失或错误 | 代理用户名、密码和工具设置 |
| 401 Unauthorized | 网站 | 网站的登录信息缺失或错误 | 你在这个网站上的账号 |
| 403 Forbidden | 网站(代理拦截请求时也可能返回) | 请求被理解但被拒绝 | 网站的访问规则或你的请求频率 |
看到的是 401 或 403,说明代理登录已经成功,请求到达了网站。
407 在各个工具里长什么样
curl
访问 https:// 网站时,curl 先请求代理建隧道,407 会让它停在这一步:
curl -x http://HOST:PORT https://example.com
curl: (56) CONNECT tunnel failed, response 407加 -v 能看到完整过程。下面这次发送的是错误密码:
> CONNECT example.com:443 HTTP/1.1
> Host: example.com:443
> Proxy-Authorization: Basic dXNlcjp3cm9uZw==
>
< HTTP/1.1 407 Proxy Authentication Required
< Proxy-Authenticate: Basic realm="proxy"
* CONNECT tunnel failed, response 407访问普通 http:// 网站时没有隧道,curl 会把代理的 407 响应当作结果直接输出,而不是报错。更多用法见 curl 怎么使用代理。
Python
requests 访问 https:// 网站时会抛出 ProxyError,详细信息里能看到原因:
ProxyError('Unable to connect to proxy', OSError('Tunnel connection failed: 407 Proxy Authentication Required'))访问 http:// 网站时则返回一个 status_code 为 407 的响应。
浏览器和自动化工具
浏览器通常会弹出代理登录框,取消后显示错误页。指纹浏览器检测代理时一般会提示代理检查失败。自动化工具里要特别注意:我们测试时,Puppeteer 在密码错误时 page.goto() 并不报错,而是正常返回一个状态码为 407 的响应;Playwright 则一直等到超时。只捕获异常的脚本,会在页面根本没加载的情况下继续往下跑。
怎么解决 407

1. 用户名或密码错误
这是最常见的原因,通常是这些小问题:
- 复制时多带了空格或换行。
- 用户名和密码填反了,或填到了错误的字段。
- 用的是旧路由或其他产品的账号密码。
从控制台重新复制。在 NanoIP,动态住宅和移动代理的账号密码属于你在 Dynamic Routes 里生成的路由;每个静态 ISP 代理在 ISP Proxies 列表里有自己的用户名和密码。每个连接都必须带上账号密码:NanoIP 不支持 IP 白名单,工具如果设成“IP 认证”或“白名单”模式,就不会发送账号密码,结果就是 407。
2. 特殊字符把代理地址拆错了
程序库和命令行工具把代理写成一个地址:http://USERNAME:PASSWORD@HOST:PORT。密码里有 @、:、/ 或 # 时,工具会在错误的位置拆分地址,发出错误的账号,甚至无法识别地址。我们用密码 p@ss:word 测试时,curl 直接报地址格式错误:
curl: (5) Unsupported proxy syntax in 'http://user:p@ss:word@127.0.0.1:18407': Port number was not a decimal number between 0 and 65535转义特殊字符后就能正常登录:
| 字符 | 转义后 |
|---|---|
@ | %40 |
: | %3A |
/ | %2F |
# | %23 |
% | %25 |
所以 p@ss:word 在地址里要写成 p%40ss%3Aword。用户名和密码分开填写的工具不需要转义。
3. 工具没有发送代理账号密码
有些设置代理的方式没有填账号密码的地方:
- Chrome 的
--proxy-server参数只能填主机和端口。Chrome 会弹窗要求输入账号密码,自动化运行时没人能点。我们测试时,把账号密码直接写进这个参数,Chrome 报ERR_NO_SUPPORTED_PROXIES。自动化时要用框架提供的代理登录方式:Playwright 在proxy选项里填账号密码,Puppeteer 用page.authenticate()。 - Chrome 自带的 SOCKS5 设置不支持账号密码。这种情况用 HTTP(S) 代理,或者用能处理 SOCKS5 登录的指纹浏览器。
- 环境变量(如
HTTPS_PROXY)很多工具会读,但不是全部;不读的工具会直接连接,或者不带账号密码去连代理。
同一组账号密码在 curl 里能用、在某个工具里不行,问题就出在这个工具上。
4. 以前能用,现在不行
如果你没有改过任何设置,检查账户:
- 套餐和余额。 静态 ISP 套餐过期,或者住宅、移动代理的流量用完,代理就不再接受你的连接。控制台里能看到剩余天数和流量。
- 新的连接信息。 如果重新生成过连接信息,所有用旧信息的工具都要更新。
用 curl 单独测试账号密码
不经过你的工具,单独测试代理。NanoIP 动态住宅和移动代理:
curl -x https://gateway.nanoip.net:1111 -U "USERNAME:PASSWORD" https://ipinfo.io/json静态 ISP 代理用 -x http://HOST:PORT,填这个 IP 自己的主机和端口。用 -U 传账号密码,就完全不用考虑转义。返回带有代理 IP 和国家的 JSON,说明账号密码没问题,问题在工具设置;返回 response 407,说明账号密码本身不对。各项信息在哪里看,见新手入门。
常见问题
407 是我的问题还是代理服务商的问题?
几乎都是你这边的设置:账号密码、工具发送账号密码的方式,或者账户余额。用重新复制的账号密码在 curl 里仍然返回 407,再联系服务商。
用 IP 白名单能避免 407 吗?
有些服务商支持把你的 IP 加入白名单,不用发送密码。NanoIP 只用用户名密码认证,在任何网络、任何设备上用法都一样。
为什么只有 HTTPS 网站报 407?
访问 HTTPS 网站时工具要先建隧道,有些工具普通请求会带账号密码,建隧道的请求却不带。升级工具,或者换一个在 CONNECT 请求里也发送 Proxy-Authorization 的工具。
407 会消耗流量吗?
请求在代理这一步就停下了,没有到达任何网站,所以不会通过代理加载页面。