Safari和iOS中使用express.js时的Gzip压缩问题

3

我在gzip压缩方面遇到了严重的问题。我在我的Node JS express.js服务器中使用以下代码进行压缩:

app.use(compression());

问题在于它在大多数浏览器和平台上表现良好,但在Mac OS的Safari和iPhone上的每个移动浏览器中均无法正常工作。 在Mac的Safari上,它会给我以下错误:
Failed to load resource: cannot decode raw data.

只有一个javascript文件出现了问题,其他都正常。

当我尝试通过URL访问该文件时,它只加载了一部分,然后变得非常奇怪,像是随机字符。在控制台中显示的错误是相同的。

我发现头文件中唯一值得注意的区别是,在iOS和Safari for Mac中,“Accept Encoding”属性仅设置为gzip和deflate。而在其他浏览器和操作系统中,它是gzip,deflate和br。

当我删除压缩行后,一切都可以无缝运行。

网站是https://kalidata.app?frame


我遇到了同样的问题,但我不明白为什么似乎没有人遇到这个错误或者认为它不重要。在我的情况下,删除压缩是不可接受的解决方案...你找到任何解决方案了吗? - Jk041
我也遇到了同样的问题。使用http2和压缩服务在桌面版Safari上无法正常工作。h2可以不使用gzip压缩,gzip压缩可以不使用http2,但是无法弄清楚为什么两者结合起来就不能正常工作。我只能接收到静态js文件的一部分。 - CORSAIR
1
@CORSAIR 目前还不支持 h2 压缩。请参见 expressjs/compression#122 - undefined
1个回答

0

我有同样的问题,唯一(丑陋)的解决办法是在Mac用户的Safari上关闭压缩。有些文件只传输了部分。有时候它能正常工作,有时候不行。iOS上的Safari可以工作,Mac OS上的Chrome和FF也可以。

expressApp.use(compression({

        // decide what to compress and what not:
        filter: (req, res) => {

            // is Mac OS -> look further
            if (req.headers['user-agent'] && (req.headers['user-agent'].indexOf('Mac OS X') > -1)){

                // not chrome && not firefox -> don't compress
                if((req.headers['user-agent'].indexOf('Chrome') == -1) && (req.headers['user-agent'].indexOf('Firefox') == -1))
                    return false;

            } 

            // fallback to standard filter function
            return compression.filter(req, res);

        }

    }));

有没有人有更好的解决方案? 使用Node 10.16.3和最新的express和compression软件包。

虽然我认为这样做没问题(解决方法确实回答了问题)- 但请记住,Stack Overflow不是一个讨论论坛。在您的答案末尾添加其他问题可能意味着人们会尝试将其删除为“不是答案”。 - DavidW
1
我认为这种方式并没有正确解决问题。作为一个新的贡献者,我没有资格在上面的问题中添加评论。 - Grundgue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接