使用curl时如何正确处理gzip压缩的页面?


139

我编写了一个bash脚本,该脚本使用curl从网站获取输出,并对html输出进行一堆字符串操作。问题是,当我在返回已压缩输出的站点上运行它时。在浏览器中转到该站点工作正常。

当我手动执行curl时,得到的压缩输出为:

$ curl "http://example.com"

这是该特定网站的标题:

HTTP/1.1 200 OK
Server: nginx
Content-Type: text/html; charset=utf-8
X-Powered-By: PHP/5.2.17
Last-Modified: Sat, 03 Dec 2011 00:07:57 GMT
ETag: "6c38e1154f32dbd9ba211db8ad189b27"
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Cache-Control: must-revalidate
Content-Encoding: gzip
Content-Length: 7796
Date: Sat, 03 Dec 2011 00:46:22 GMT
X-Varnish: 1509870407 1509810501
Age: 504
Via: 1.1 varnish
Connection: keep-alive
X-Cache-Svr: p2137050.pubip.peer1.net
X-Cache: HIT
X-Cache-Hits: 425

我知道返回的数据已压缩,因为这将按预期返回html:

$ curl "http://example.com" | gunzip

我不想通过gunzip传递输出,因为脚本可以在其他站点上按原样工作,而通过gzip传递将破坏该功能。

我尝试过的

  1. 更改用户代理(我尝试使用浏览器发送的相同字符串,“ Mozilla / 4.0”等)
  2. 男子卷曲
  3. 谷歌搜索
  4. 搜索stackoverflow

一切都是空的

有任何想法吗?


对我来说,问题是cURL无法解压缩Brotli(curl 7.54.0 (x86_64-apple-darwin17.0) libcurl/7.54.0 LibreSSL/2.0.20 zlib/1.2.11 nghttp2/1.24.0)-通过br从中删除将其解决Accept-Encoding。看到stackoverflow.com/questions/18983719/...
尼诺Škopac

Answers:


260

curl如果您设置了--compressed标志,将自动解压缩响应:

curl --compressed "http://example.com"

--compressed (HTTP)使用libcurl支持的一种算法请求压缩的响应,并保存未压缩的文档。如果使用此选项,并且服务器发送了不受支持的编码,则curl将报告错误。

最有可能支持gzip,但是您可以通过在“功能”行中的某处运行curl -V并查找libz来检查它:

$ curl -V
...
Protocols: ...
Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz 

请注意,这里确实是有问题的网站。如果curl未传递Accept-Encoding: gzip请求标头,则服务器不应发送压缩的响应。


24
这似乎是一个curl错误,因为它应该根据响应而不是根据请求(如果它确实支持gzip)触发触发其解码。引用HTTP 1.1:“如果请求中不存在Accept-Encoding字段,则服务器可以假定客户端将接受任何内容编码。” 但是它确实说在这种情况下服务器应该不对内容进行编码,嗯,去图。
2013年

实际上在我的版本上工作--comp --compress --compressed
Radu Toader

3
这也设置了请求标头:“ Accept-Encoding:deflate,gzip”,这很棒,因为如果服务器提供gzip而没有gzip,
则只

在1分钟内用此解决方案帮助我的质量检查!谢谢 !就是说,我的应用程序实际上是使用Content-Encoding:gzip发送gzip响应。浏览器和现代工具(例如httpie)会自动处理它。我想卷曲只是需要一个“提示”
Faraway

令人惊讶的是,设置Accept-Encoding: deflate, gzip还不够-即使服务器返回带有的gzip响应Content-Encoding: gzip,curl也不会自动对其解压缩。该--compressed标志是必需的。
rjh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.