node.js - Safari 和 iOS 中的 Express.js 中的 Gzip 压缩问题

标签 node.js macos express safari gzip

我在 gzip 压缩方面遇到了严重问题。我在 Node JS express.js 服务器中使用压缩:

app.use(compression());

问题是它在大多数浏览器和大多数平台上都能很好地工作,但在 Mac OS 的 Safari 和 iPhone 中的每个移动浏览器上却不起作用。 在 Mac 版 Safari 上,出现以下错误:

Failed to load resource: cannot decode raw data.

这只发生在一个 javascript 文件上,其余的都很好。

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

我在 header 中看到的唯一明显的区别是,在 iOS 和 Mac 版 Safari 中,“接受编码”属性仅设置为 gzip 和 deflate。与其他浏览器和操作系统一样,它是 gzip、deflate 和 br。

当我移除压缩线时,一切都完美地工作。

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

最佳答案

我也有同样的问题,唯一(丑陋的)解决方法是关闭 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 和压缩包。

关于node.js - Safari 和 iOS 中的 Express.js 中的 Gzip 压缩问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53270445/

相关文章:

java - 将 Android Studio 项目从 Windows 移动到 Mac 后出现 ClassNotFoundException (AppCompatActivity.class)

linux - 如何在 Linux/OS X 上动态添加到 $PATH

node.js - 如何使用 GCM 在 Node js 中的 android 设备上推送通知?

node.js - 在nodejs中测试后台进程(使用磁带)

node.js - Node 做出什么事件顺序保证?

mysql - Jade不会显示mysql的结果

javascript - "Uncaught ReferenceError: room is not defined"尝试从 Twilio 视频室断开连接时

javascript - 如何在字符串中搜索第一次出现的 ":/",然后搜索找到的子字符串(包括 ":/")的所有其他出现?

java - 无法在 libjvm.dylib (Mac OS) 中找到方法 JNI_GetCreatedJavaVMs

angularjs - Node/Express - POST 请求从远程服务器接收 zip,传回客户端