2

刚开始使用谷歌云存储。我在从它接收 gzip 文件时遇到问题。存储的文件经过 gzip 压缩,但会根据要求进行解压缩。我已阅读所有文档、论坛并尝试了数十种不同的标头组合,但在浏览器中获取的文件仍然没有压缩。有人能指出我做错了什么吗?

关于 gzip、标头、转码的文章 https://cloud.google.com/storage/docs/transcoding

我使用此命令将文件移动到存储中

gsutil -h "Cache-Control:public,max-age=10,no-transform" cp  -Z bundle.js gs://lol-champs.tomdid.com 

文件在上传文件之前被 gzip 压缩,一旦它被存储,大小会减少 5 倍,我已经在控制台中签入。

浏览器请求标头

Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8,lt;q=0.6
Cache-Control:no-cache
Connection:keep-alive
Host:lol-champs.tomdid.com
Pragma:no-cache
Referer:http://lol-champs.tomdid.com/

响应标头

Accept-Ranges:bytes
Access-Control-Allow-Origin:*
Access-Control-Expose-Headers:Content-Encoding
Access-Control-Expose-Headers:Content-Length
Access-Control-Expose-Headers:Content-Type
Cache-Control:public,max-age=10,no-transform
Content-Language:en
Content-Type:application/javascript
Date:Sat, 15 Oct 2016 21:40:14 GMT
ETag:"8505f976c2ffbf1e69c3ee9fdf2f04d5"
Expires:Sat, 15 Oct 2016 21:40:24 GMT
Last-Modified:Sat, 15 Oct 2016 21:40:09 GMT
Server:UploadServer
Transfer-Encoding:chunked
x-goog-generation:1476567609681000
x-goog-hash:crc32c=Gik6aA==
x-goog-hash:md5=hQX5dsL/vx5pw+6f3y8E1Q==
x-goog-metageneration:1
x-goog-storage-class:STANDARD
x-goog-stored-content-encoding:gzip
x-goog-stored-content-length:290207

因此,谷歌设置了自定义标头,内容在存储中被压缩,但它向我发送解压缩的响应,并且没有 Content-Encoding 标头。

不确定我上传文件的方式是错误的,还是缺少一些标题。失落的感觉。链接到文件-> http://lolchamps.tomdid.com/bundle.js

任何帮助将非常感激。

更新:发现了一些有趣的东西,如果我使用谷歌 URL 请求文件 - https://storage.googleapis.com/lolchamps.tomdid.com/bundle.js它返回 gzip 文件,如果通过我的域请求相同的文件它返回解压版。为什么???我闻到了黑魔法。

4

2 回答 2

0

我似乎无法重现这个......?

$ curl -v http://lolchamps.tomdid.com/bundle.js
[...]
< Content-Length: 290667
< Content-Encoding: gzip
[...]

编辑:与 Chrome 相同,完整请求如下:

GET /bundle.js HTTP/1.1
Host: lolchamps.tomdid.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36
Accept: */*
DNT: 1
Referer: http://lolchamps.tomdid.com/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8,de;q=0.6,de-DE;q=0.4

和回应:

HTTP/1.1 200 OK
Date: Tue, 18 Oct 2016 17:27:43 GMT
Cache-Control: no-transform
Expires: Wed, 18 Oct 2017 17:27:43 GMT
Last-Modified: Sun, 16 Oct 2016 22:53:39 GMT
ETag: "7c79e6fd21a30bf99f0344a7fb9f6105"
x-goog-generation: 1476658419217154
x-goog-metageneration: 1
x-goog-stored-content-encoding: gzip
x-goog-stored-content-length: 290667
Content-Type: application/javascript
Content-Encoding: gzip
Content-Language: en
x-goog-hash: crc32c=vZKmgQ==
x-goog-hash: md5=fHnm/SGjC/mfA0Sn+59hBQ==
x-goog-storage-class: STANDARD
Accept-Ranges: bytes
Content-Length: 290667
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: Content-Type
Access-Control-Expose-Headers: Content-Length
Access-Control-Expose-Headers: Content-Encoding
Server: UploadServer
于 2016-10-17T18:33:27.587 回答
0

当您的客户使用Accept标头表示它支持内容(-编码)压缩(例如,gzip)时,GCP 会返回压缩响应(因为您的客户要求它)但不包括Content-Length标头。取而代之的是X-Goog-Stored-Content-Length标题,它告诉原始内容的大小。

默认情况下,Curl 不要求压缩响应,这就是您在那里看不到问题的原因。您可以使用curl --compressed要求压缩响应,如果这样做,curl --compressed -D -您将看到 no Content-Length

于 2022-01-08T09:35:29.357 回答