Firefox无法解压缩gzip文件

Firefox无法解压缩gzip文件,firefox,amazon-s3,http-headers,gzip,mime-types,Firefox,Amazon S3,Http Headers,Gzip,Mime Types,我在AWSS3上存储了.gz文件 使用S3REST-API,我生成指向单个文件的经过身份验证的链接。我还设置了内容头选项,以便请求这些URL的浏览器将解压缩并下载gzip文件作为附件 生成的s3 url如下所示: https://MY_BUCKET.s3.amazonaws.com/PATH_TO/file.ext.gz ?AWSAccessKeyId=MY_KEY &Expires=DATE_TIME &Signature=MY_SIGNATURE &r

我在AWSS3上存储了.gz文件

使用S3REST-API,我生成指向单个文件的经过身份验证的链接。我还设置了内容头选项,以便请求这些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文件

GET请求对经过身份验证的URL的响应头如下所示:

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是否寻找不同的头和/或头值来表示解压缩?

解决方案似乎是从文件名末尾删除
.gz

当您打算让最终用户下载一个
.gz
文件时,在
.gz
文件上设置
内容编码:gzip
是一种常见的配置错误;e、 g.下载源程序包的
.tar.gz

这不是你正在做的。。。事实恰恰相反,本质上。。。但我怀疑你看到了试图解决这个问题的征兆

事实上,我所描述的配置应该只在gzip一个已经gzip的文件时才出现(当然,您不应该这样做)。。。但它在很长一段时间内都是由(iirc)默认的ApacheWeb服务器配置确立的。旧的bug报告似乎表明Firefox开发人员很难掌握如何使用
内容编码:gzip
,尤其是在下载方面。他们似乎有点痴迷于浏览器在保存到磁盘时不应撤消内容编码的想法,因为保存到磁盘与“呈现”下载的内容不同。对我来说,这是胡说八道,对RFC的一种过于字面的解释

我怀疑你看到的是那个老问题的遗留问题


与您的概念相反,使用
内容编码:gzip
存储文件而不使用
.gz
扩展名是非常正确的。。。可以说,事实上,不使用
.gz
扩展来存储这样的内容更为正确,因为
.gz
意味着(至少对Firefox而言)下载用户应该希望下载压缩内容并以压缩形式保存。

1。压缩内容的背景信息

Michael更改文件扩展名解决了这个问题,因为重要的一步是更改
内容类型
头,以反映压缩文件中的底层内容,而不是压缩文件本身的内容

在许多Web服务器中,mime类型是根据文件扩展名检测的-例如,您可能有一个mime类型
应用程序/gzip
,对应于
.gz
文件扩展名(在默认的Debian安装nginx时,可以在
/etc/nginx/mime.types
中找到)。然后,服务器会将与此mime类型匹配的文件的标题设置为
Content-Type:application/gzip

如果您的浏览器收到一个
内容类型
标题,提示二进制压缩内容正在发送,而不是压缩文件中的文本,它将假定它不是供人使用的,并且可能不会显示它。我的(
Mozilla/5.0(X11;Ubuntu;Linux x86;rv:75.0)Gecko/20100101 Firefox/75.0
)没有

2。收割台调整

  • 设置
    内容编码:“gzip”
    标题
  • 为要以纯文本显示的文件设置
    内容类型:“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';
        }
    
    }
    

    您是否在没有扩展名
    .gz
    的gzip文件上测试过这个问题?对于特定的文件,使用比通用的
    应用程序/octet流更准确的
    内容类型:
    怎么样?到底是什么。。。删除
    .gz
    扩展名(在s3中重命名文件,但实际上没有解压缩),修复了这个问题,现在所有4个浏览器都可以工作。我感到不舒服的是,我现在在s3中存储的文件是gzip的,但扩展名不是gzip的,但我想这比以前的情况要好@Michael sqlbot请随意发布答案,我会接受的。如果你对这种行为有任何了解,我将永远感激你。