【发布时间】:2023-04-03 06:50:02
【问题描述】:
我编写了一个 bash 脚本,它使用 curl 从网站获取输出,并对 html 输出进行一系列字符串操作。问题是当我对一个返回其输出 gzip 的站点运行它时。在浏览器中访问该站点可以正常工作。
当我手动运行 curl 时,我得到 gzipped 输出:
$ 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
我知道返回的数据是 gzip 压缩的,因为这会返回 html,正如预期的那样:
$ curl "http://example.com" | gunzip
我不想通过 gunzip 管道输出,因为脚本在其他站点上按原样运行,而通过 gzip 管道会破坏该功能。
我尝试过的
- 更改用户代理(我尝试了浏览器发送的相同字符串,“Mozilla/4.0”等)
- 男人卷曲
- google search
- 搜索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) - 通过从Accept-Encoding中删除br解决了这个问题。见stackoverflow.com/questions/18983719/… -
这种行为据说已经改变了。单独尝试
curl -sSv https://stackoverflow.com/ |& rg -i 'gzip|accept'和--compressed。除非curl通过Accept-Encoding,否则服务器不会压缩响应。