Firefox 无法解压 gzip 文件
Firefox fails to decompress gzip files
我在 AWS s3 上存储了 .gz 文件。
使用 s3 REST-API,我正在生成指向单个文件的经过身份验证的链接。我还设置了 content-header 选项,以便请求这些 url 的浏览器将解压缩并下载 gzip 文件作为附件。
生成的 s3 url 看起来像这样:
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 文件。
对已验证 url 的 GET 请求的响应 header 如下所示:
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 是否会寻找不同的 headers and/or header 值来指示解压缩?
解决方案似乎是从文件名末尾删除 .gz
。
当您打算让最终用户下载并最终得到一个 .gz
文件时,在 .gz
文件上设置 Content-Encoding: gzip
是一种常见的错误配置;例如正在下载.tar.gz
个源码包。
这不是您正在做的事情...实际上恰恰相反...但我怀疑您看到的是试图解决该问题的症状。
事实上,我描述的配置应该只在你压缩一个已经压缩过的文件时出现(当然,你不应该这样做)......但它已经根深蒂固了很长时间( iirc) 默认的 Apache Web 服务器配置。旧的错误报告似乎表明 Firefox 开发人员很难掌握 Content-Encoding: gzip
应该做什么,尤其是在下载方面。他们似乎有点着迷,认为浏览器在保存到磁盘时不应该取消内容编码,因为保存到磁盘与 "rendering" 下载的内容不同。对我来说,那是无稽之谈,是对 RFC 过于直白的解释。
我怀疑你看到的是那个旧问题的遗留问题。
与您的想法相反,以 Content-Encoding: gzip
而不 扩展名 .gz
存储文件是非常正确的...可以说,事实上,它是更多 在没有 .gz
扩展名的情况下存储此类内容是正确的,因为 .gz
暗示(至少对于 Firefox,显然)下载用户应该想要压缩内容下载并以压缩形式保存。
1.压缩内容背景
Michael 更改文件扩展名解决了这个问题,因为重要的一步是更改 Content-Type
header 以反映 底层内容 压缩文件,而不是压缩文件本身。
在许多网络服务器中,mime 类型 是根据文件扩展名检测的 - 例如,您的 mime 类型 application/gzip
可能对应于 .gz
文件扩展名(在默认的 Debian 安装的 nginx 上,可以在 /etc/nginx/mime.types
中找到)。然后,您的服务器将为匹配此 mime 类型的文件将 headers 设置为 Content-Type: application/gzip
。
如果您的浏览器收到 Content-Type
header 提示正在处理二进制压缩内容而不是压缩文件中的文本,它会假定它不供人类使用并且可能不会显示它.我的 (Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0
) 没有。
2。 Header调整
- 设置一个
Content-Encoding: 'gzip'
header
- 设置
Content-Type: 'text/plain'
header 为您想要以纯文本显示的文件
浏览器(如果支持 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';
}
}
我在 AWS s3 上存储了 .gz 文件。
使用 s3 REST-API,我正在生成指向单个文件的经过身份验证的链接。我还设置了 content-header 选项,以便请求这些 url 的浏览器将解压缩并下载 gzip 文件作为附件。
生成的 s3 url 看起来像这样:
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 文件。
对已验证 url 的 GET 请求的响应 header 如下所示:
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 是否会寻找不同的 headers and/or header 值来指示解压缩?
解决方案似乎是从文件名末尾删除 .gz
。
当您打算让最终用户下载并最终得到一个 .gz
文件时,在 .gz
文件上设置 Content-Encoding: gzip
是一种常见的错误配置;例如正在下载.tar.gz
个源码包。
这不是您正在做的事情...实际上恰恰相反...但我怀疑您看到的是试图解决该问题的症状。
事实上,我描述的配置应该只在你压缩一个已经压缩过的文件时出现(当然,你不应该这样做)......但它已经根深蒂固了很长时间( iirc) 默认的 Apache Web 服务器配置。旧的错误报告似乎表明 Firefox 开发人员很难掌握 Content-Encoding: gzip
应该做什么,尤其是在下载方面。他们似乎有点着迷,认为浏览器在保存到磁盘时不应该取消内容编码,因为保存到磁盘与 "rendering" 下载的内容不同。对我来说,那是无稽之谈,是对 RFC 过于直白的解释。
我怀疑你看到的是那个旧问题的遗留问题。
与您的想法相反,以 Content-Encoding: gzip
而不 扩展名 .gz
存储文件是非常正确的...可以说,事实上,它是更多 在没有 .gz
扩展名的情况下存储此类内容是正确的,因为 .gz
暗示(至少对于 Firefox,显然)下载用户应该想要压缩内容下载并以压缩形式保存。
1.压缩内容背景
Michael 更改文件扩展名解决了这个问题,因为重要的一步是更改 Content-Type
header 以反映 底层内容 压缩文件,而不是压缩文件本身。
在许多网络服务器中,mime 类型 是根据文件扩展名检测的 - 例如,您的 mime 类型 application/gzip
可能对应于 .gz
文件扩展名(在默认的 Debian 安装的 nginx 上,可以在 /etc/nginx/mime.types
中找到)。然后,您的服务器将为匹配此 mime 类型的文件将 headers 设置为 Content-Type: application/gzip
。
如果您的浏览器收到 Content-Type
header 提示正在处理二进制压缩内容而不是压缩文件中的文本,它会假定它不供人类使用并且可能不会显示它.我的 (Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0
) 没有。
2。 Header调整
- 设置一个
Content-Encoding: 'gzip'
header - 设置
Content-Type: 'text/plain'
header 为您想要以纯文本显示的文件
浏览器(如果支持 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';
}
}