如何发送不带Content-Length头的CURL请求?
解决CURL请求中自动添加Content-Length头的问题
你尝试通过CURL发送PUT请求时,希望完全不携带Content-Length头,但无论使用参数还是手动设置,服务器仍能接收到该头。你试过的两种方法:
- 方法1:使用
--ignore-content-length参数,服务器仍获取到实际的Content-Lengthcurl --ignore-content-length --request PUT somehttps-domain/ignored-content-length.txt --upload-file ignored-content-length.txt -kv - 方法2:手动设置空的Content-Length头(注意字段名拼写错误:
Content-Lenght应为Content-Length),服务器收到的Content-Length为0curl --request PUT somehttps-domain/ignored-content-length.txt --upload-file ignored-content-length.txt --header 'Content-Length:' -kv
核心原因
HTTP/1.1规范中,非分块编码的请求必须携带Content-Length头(HEAD请求除外),CURL默认会根据请求体自动计算并添加该头,这是符合协议规范的行为。
解决建议
强制使用分块传输编码
分块传输不需要Content-Length头,通过--transfer-encoding chunked参数让CURL发送Transfer-Encoding: chunked头,替代Content-Length:curl --request PUT somehttps-domain/ignored-content-length.txt --upload-file ignored-content-length.txt --transfer-encoding chunked -kv此时服务器会通过分块方式接收请求体,不会收到Content-Length头。
切换到HTTP/2协议
HTTP/2不依赖Content-Length头,而是通过帧机制传输数据。如果服务器支持HTTP/2,添加--http2参数即可:curl --request PUT somehttps-domain/ignored-content-length.txt --upload-file ignored-content-length.txt --http2 -kv避免无效的头设置方式
手动设置空值的Content-Length头只会让服务器收到值为0的头,无法完全移除该字段,这种方式不可行。
内容的提问来源于stack exchange,提问作者TomJava
相关产品推荐
相关产品推荐

