如何阻止curl自动将请求头名称转为小写以规避网站拦截?
解决curl自动转换请求头名称为小写的问题
核心结论
curl从7.55.0版本开始默认将所有请求头名称转换为小写,目前没有官方配置选项可以强制保留请求头的大小写格式。这是因为HTTP/2规范要求请求头字段名小写,curl为了兼顾HTTP/2和HTTP/1.x的兼容性,统一采用了小写处理逻辑。
可行解决办法
1. 强制使用HTTP/1.0协议
HTTP/1.0对请求头大小写没有强制要求,curl在HTTP/1.0模式下会严格保留你指定的请求头大小写格式。执行命令时添加--http1.0参数即可:
curl --http1.0 -H 'User-Agent: YYY' -H 'Accept: */*' https://target-site.com
2. 修改curl源码重新编译
如果目标网站必须使用HTTP/1.1或更高版本,只能通过修改curl源码来禁用请求头小写转换:
- 找到curl源码中处理请求头的模块(通常在
src/http.c文件中) - 定位到将请求头字段名转换为小写的代码段(比如
curl_http2_hdr_normalize或类似函数) - 注释或删除该转换逻辑后,重新编译curl
3. 改用其他工具模拟请求
如果不想修改或重新编译curl,可以用其他默认保留请求头大小写的工具,比如Python的requests库(仅HTTP/1.1模式下有效):
import requests headers = { 'User-Agent': 'YYY', 'Accept': '*/*' } response = requests.get('https://target-site.com', headers=headers) print(response.text)
补充说明
虽然HTTP标准规定请求头字段名是大小写不敏感的,但部分网站的WAF或指纹识别系统会严格校验请求头的大小写格式,这正是curl被拦截而wget可以正常访问的原因——wget默认不会转换请求头的大小写。
内容的提问来源于stack exchange,提问作者Samul
相关产品推荐
相关产品推荐

