Firefox无法解压缩gzip文件

时间:2015-05-17 22:37:19

标签: firefox amazon-s3 http-headers gzip mime-types

我有存储在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是否会查找不同的标头和/或标头值以指示解压缩?

2 个答案:

答案 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。标题调整

  1. 设置Content-Encoding: 'gzip'标头
  2. 为要用纯文本显示的文件设置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';
    }

}