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调整

  1. 设置一个Content-Encoding: 'gzip'header
  2. 设置 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';
    }

}