如何删除 cURL 发送的默认标头?

Posted

技术标签:

【中文标题】如何删除 cURL 发送的默认标头?【英文标题】:How can I remove default headers that cURL sends? 【发布时间】:2015-09-26 09:27:11 【问题描述】:

Curl 默认添加诸如Content-typeUser-agent 之类的标头。通常这是一件好事,但我正在尝试测试当这些标头丢失时我们的服务器会做什么。

我的问题是 Content-type 标头。如果它丢失,服务器正确地假定用户发送了 JSON。但是,curl 实际上添加了缺少的标头,并错误地假定我发布的内容是application/x-www-form-urlencoded。它还发送 / 的 Accept 标头。

我认为这是很好的默认行为,但我基本上希望它不发送我没有指定的标头。有这样的选择吗?

curl -v -X POST 'https://example.com' -d '...'

> User-Agent: curl/7.37.1
> Host: domain.com
> Accept: */*
> Content-Length: 299
> Content-Type: application/x-www-form-urlencoded

【问题讨论】:

【参考方案1】:

似乎curl 发送了 3 个标头。要在没有它们的情况下执行请求,您可以附加参数:

-H 'User-Agent:' -H 'Accept:' -H 'Host:'

+1 到 @cmlndz 回答,因为他解释了如何删除单个标题。

您可以通过添加-v来检查实际发送了哪些标头。

【讨论】:

如果您的请求有正文(如 POST 请求),它还将设置 Content-Length: 433 或任何正文的大小。您可以使用 -H 'Content-Length:' 排除该标头(尽管这可能会导致无效请求,因为它应该包含长度或设置 Transfer-Encoding 标头) -H 'Host:' 很可能会导致“HTTP 错误 400。请求主机名无效。”您还需要将 --http1.0 参数添加到 curl 命令。【参考方案2】:

-H 标志与要删除的标头一起使用,并且在: 之后没有内容

-H, --header LINE   Custom header to pass to server (H)

样本

-H 'User-Agent:'

这将使请求没有 User-Agent 标头(而不是使用空值发送)

【讨论】:

要删除代理标头,请将 -H 替换为 --proxy-header,例如--proxy-header "Proxy-Connection:" 使用标准的 Windows shell (cmd.exe) 我不得不用双引号替换单引号(或完全删除它们)。 -H 'User-Agent:' 按预期删除标头(没有标头,也不会发送任何值),但要小心-H 'Content-Type:',它将发送带有空值的标头。 curl 命令的不同行为很奇怪。 与@mikep 的经验相反,我发现(来自libcurl,版本7.63.0)将“Content-Type:”设置为标头确实从请求中完全删除了该标头,至少根据Wireshark 捕获。 我有curl 7.66.0 (x86_64-pc-cygwin) libcurl/7.66.0,如果我将-H 'Content-Type:' 作为参数传递它不会发送Content-Type 标头。

以上是关于如何删除 cURL 发送的默认标头?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除 HttpClient 请求标头 C# 中的默认字符集

如何使用浏览器发送授权标头

如何删除linux curl 命令行

使用 Expect --upload-file 标头发送 curl -> Node.js

如何使用命令行 curl 显示请求标头

如何在将请求传递给上游服务器之前删除 Nginx 中的客户端标头?