【问题标题】:How can I remove default headers that cURL sends?如何删除 cURL 发送的默认标头?
【发布时间】: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

【问题讨论】:

    标签: curl http-headers content-type 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 标头。
    猜你喜欢
    • 2022-09-27
    • 2016-12-17
    • 2011-03-26
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    相关资源
    最近更新 更多