6

我刚刚在尝试访问某些页面时在 Chrome 上发现了一个非常奇怪的行为。它将提示将它们作为.gz文件下载而不是加载它们。

这只发生在当前的 Chrome 和所有平台上。

当页面正确加载时,我可以在 Inspector 上看到这个

Resource interpreted as Document but transferred with MIME type application/x-gzip:https://confluence.example.com/display/engp/PR-1221 ”。

我知道这些是由配置为使用 gzip 压缩的 nginx 服务器提供的,但这并没有错。

  gzip  on;  # that's on nginx part

我几乎可以肯定这是 nginx 配置有问题,但是什么?

使问题更有趣(也更烦人)的是,如果您从超链接复制 URL 并将其粘贴到浏览器,它将正确打开页面。是的,这只发生在超链接上。

我试图在这方面找到关于 chrome 的错误报告,但我唯一能找到的是其他人确实报告了与 reddit 页面或其他页面类似的问题,如果不是相同的问题github.com

Request URL:https://confluence.example.com/display/engp/PR-1221
Request Method:GET
Status Code:200 OK
Request Headersview source
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset:UTF-8,*;q=0.5
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
DNT:1
Host:example.com
Referer:https://example.com/browse/PR-1221
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.152 Safari/537.22
响应标头view source
访问控制允许凭据:true
Access-Control-Allow-Headers:DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type
访问控制允许方法:GET、POST、OPTIONS、HEAD
访问控制允许来源:*
呸:呸
缓存控制:无缓存,必须重新验证
连接:保持活动
内容编码:gzip
内容类型:文本/html;字符集=UTF-8
日期:2013 年 3 月 4 日星期一 13:29:48 GMT
过期时间:周四,1970 年 1 月 1 日 00:00:00 GMT
富:酒吧
服务器:nginx/1.2.6
传输编码:分块
X-Confluence-Request-Time:1362403788150
X-Seraph-登录原因:OK
4

3 回答 3

7

我遇到了同样的行为,并向 chrome 开发人员发送了一份报告。同时,我已经禁用了我所有的 chrome 扩展,并且不再识别这种行为。我觉得有点奇怪,因为昨天效果很好。

编辑:我发现 chrome 导致扩展。就我而言,它是“悬停缩放”。任何其他已安装的扩展程序(Adblock、PageSpeed、Tweetdeck 等)都可以正常工作,并且不会出现“下载 .gz 文件”问题。开发人员正在解决这个问题(https://code.google.com/p/hoverzoom/issues/detail?id=489

EDIT2:我不再使用 HoverZoom,因为扩展现在是间谍软件(看看https://code.google.com/p/hoverzoom/issues/detail?id=489#c16)。而不是 Hover-Zoom 我现在使用 Hover-Free ( https://chrome.google.com/webstore/detail/hover-free/hcmnnggnaofmhflgomfjfbndngdoogkj/related )。希望对您有所帮助。感谢Caschy(http://stadt-bremerhaven.de/chrome-erweiterung-hoverzoom-sendet-heimlich-daten/

于 2013-03-04T14:14:37.727 回答
4

也有这个问题。通过编辑我的 Wordpress 网站的 htaccess 找到了解决方案,强制特定文件类型按原样加载;

<IfModule mod_mime.c>
AddCharset utf-8 .html
AddCharset utf-8 .json
AddEncoding gzip .gz
</IfModule>
<FilesMatch "(\.html|\.html\.gz)$">
ForceType text/html
</FilesMatch>
<FilesMatch "(\.json|\.json\.gz)$">
ForceType text/javascript
</FilesMatch>

我认为这是网站缓存插件的问题。就我而言,WPSuperCache

于 2013-07-22T05:53:15.153 回答
0

我有同样的问题,只是Content-Type响应头中的错误。要检查Content-Type转到 Google Chrome 开发人员工具 (F12) 中的网络选项卡并查看Type列。很可能它类似于binaryor gzip

要解决您的问题,请在 NGINX 配置中添加两件事:

  1. 我有预压缩文件,所以必须确保服务器发送正确的文件Content-Type(Apache Web 服务器上的ForceType指令是什么)。请参阅如何使用 nginx 提供预压缩文件,以便它们在浏览器中显示为文本?

    你需要这个HttpGzipStatic模块。

  2. 添加gzip_vary on. 请参阅StackPath:Accept-Encoding:这很重要

    想象一下两个客户端:一个没有压缩的旧浏览器,一个有压缩的现代浏览器。如果他们都请求同一个页面,那么根据谁先发送请求,压缩或未压缩版本将存储在 CDN 中。现在问题开始了:旧浏览器可能会请求常规的“index.html”并获取缓存的压缩版本(随机垃圾数据),或者新浏览器可能会获取缓存的未压缩版本并尝试“解压缩”它。坏消息,不管怎样。

    修复是让源服务器发回Vary: Accept-Encoding

参考

于 2018-01-29T13:20:31.940 回答