我有存储在AWS s3上的.gz文件。
使用s3 REST-API,我生成指向单个文件的经过身份验证的链接。我还设置了content-header选项,以便请求这些URL的浏览器将解压缩并将gzip压缩文件作为附件下载。
生成的s3网址如下所示:
https://MY_BUCKET.s3.amazonaws.com/PATH_TO/file.ext.gz
?AWSAccessKeyId=MY_KEY
&Expires=DATE_TIME
&Signature=MY_SIGNATURE
&response-content-disposition=attachment%3B%20filename%3D%22file.ext%22
&response-content-encoding=gzip
&response-content-type=application%2Foctet-stream
&x-amz-security-token=MY_TOKEN
链接的行为符合预期:(全部在OSX上)Chrome(42.0.2311),Safari(8.0.6),Opera(29.0),
但不是Firefox(38.0.1)
Firefox正确下载并重命名文件,但无法解压缩gzip压缩文件。
对经过身份验证的网址的GET请求的响应标头如下所示:
Accept-Ranges:bytes
Content-Disposition:attachment; filename="file.ext"
Content-Encoding:gzip
Content-Length:928
Content-Type:application/octet-stream
Date:SOME_DATE_TIME
ETag:"MY_ETAG"
Last-Modified:SOME_OTHER_DATE_TIME
Server:AmazonS3
x-amz-expiration:expiry-date="ANOTHER_DATE_TIME"
x-amz-id-2:MY_AMZ_ID
x-amz-request-id:MY_AMZ_REQUEST_ID
x-amz-server-side-encryption:AES256
Firefox是否会查找不同的标头和/或标头值以指示解压缩?
答案 0 :(得分:5)
解决方案似乎是从文件名末尾删除.gz
。
当您打算让最终用户下载并最终获得Content-Encoding: gzip
文件时,在.gz
文件上设置.gz
是一种常见的错误配置;例如下载.tar.gz
源包。
这不是你在做什么......它恰恰相反,基本上......但我怀疑你是否看到了试图解决这个问题的症状。
事实上,我描述的配置应该只是当你压缩已经gzip压缩文件时(当然,你不应该这样做)...但它已经根深蒂固了( iirc)默认的Apache Web服务器配置。旧的bug报告似乎表明Firefox开发人员很难掌握Content-Encoding: gzip
应该做些什么,特别是在下载方面。看起来他们有点痴迷,认为浏览器在保存到磁盘时不应该撤消内容编码,因为保存到磁盘并不像"渲染"下载的内容。对我来说,这是无意义的,对RFC的过于直译的解释。
我怀疑你所看到的是旧问题的遗产。
与您的概念相反,使用Content-Encoding: gzip
存储不带 .gz
扩展名的文件是完全正确的......事实上,它可以说是#&# 39; s 更多正确存储此类内容而没有.gz
扩展名,因为.gz
暗示(至少对于Firefox,显然)下载用户应该想要压缩内容下载并以压缩格式保存。
答案 1 :(得分:1)
1。压缩内容的背景
Michael对文件扩展名的更改解决了该问题,因为重要的步骤是更改Content-Type
标头以反映压缩文件中的底层内容,而不是压缩文件中的文件本身。
在许多Web服务器中,根据文件扩展名检测到 mime类型-例如,您可能具有application/gzip
的哑剧类型,对应于.gz
文件扩展名(在默认的Debian Nginx安装,可以在/etc/nginx/mime.types
中找到。然后,您的服务器会将与此MIME类型匹配的文件的标头设置为Content-Type: application/gzip
。
如果您的浏览器收到一个Content-Type
标头,表明正在压缩二进制压缩内容,而不是压缩文件中的文本,则它将假定该文件不是供人类使用的,并且可能不会显示。我的(Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0
)没有。
2。标题调整
Content-Encoding: 'gzip'
标头Content-Type: 'text/plain'
标头浏览器(如果支持gzip压缩)应解压缩并显示客户端的内容。
3。现实世界中的例子
/usr/share/doc
包含文本文档,其中许多文档也已通过gzip压缩。
通过将以下内容添加到nginx server {}
块中,可以在客户端上启用透明解压缩:
# local documentation access
location /doc {
alias /usr/share/doc;
autoindex on; # allow dir listings
allow 127.0.0.1; deny all; # anyone outside is forbidden
# display .gz content in text on the browser
location ~ \.gz {
default_type text/plain;
add_header Content-Encoding: 'gzip';
}
}