我在 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。
当我移除压缩线时,一切都完美地工作。
最佳答案
我也有同样的问题,唯一(丑陋的)解决方法是关闭 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/