无法加载资源:net :: ERR_CONTENT_LENGTH_MISMATCH

78
这个错误信息是什么意思,如何解决?这是来自Windows 7上Google Chrome v33.0控制台的消息。

未能加载资源:net::ERR_CONTENT_LENGTH_MISMATCH           http://and.img.url/here.png

我正在尝试使用jQuery更改图像的src属性。例如,像这样(简化):
$('.image-prld').attr('src', someDynamicValue);

页面上大约有30张图片。每次重新加载页面时,随机的一些图片会出现上述错误。但有时所有图片都能正常显示,没有任何错误。
当出现这个错误时,特定的图片将显示为这样

enter image description here

然而,当我在新标签页中打开错误消息旁边的链接时,图片正在加载,这在逻辑上表明该图片是有效的且存在的。

1
只是猜测,您的浏览器从服务器接收到一个“content-length”头,该头的值与实际内容长度不相等。 - Niet the Dark Absol
不,我没有。我在其他网站上也没有看到这条消息。 - user3332579
@Niet the Dark Absol,那么在另一个标签页上成功加载图像的故事是什么?相同的URL,在不同的页面/标签页上,一个可以加载,另一个却失败了。 - user3332579
它只影响Chrome这一点让我感到怀疑。 - Kevin B
当我在远程服务器上运行angular cli ng serve并尝试本地访问时,我也遇到了这个错误。 在本地运行它工作正常。 - A.W.
显示剩余5条评论
14个回答

51

Docker + NGINX

在我的情况下,问题是nginx docker容器的磁盘空间。我有10GB的日志文件,当我减少这个数量时,它可以正常工作。

逐步操作(适用于新手)

  1. 进入您的容器:docker exec -it <container_id> bash

  2. 进入到您的日志中,例如:cd /var/log/nginx

  3. [可选] 查看文件大小:对于单个文件大小,请使用 ls -lh,对于文件夹大小,请使用 du -h

  4. 使用 > file_name 清空文件。

  5. 就可以运行了!

高级开发人员/系统管理员

使用 > file_name 或类似方法清空 nginx 日志文件。

希望能帮助到您


3
在第4步只需使用>文件名即可节省10个按键。 - Ian Ellis
感谢@IanEllis。我添加了高级开发人员/系统管理员选项。 - mrroot5
我遇到了这个问题,但不确定为什么会发生。我有一张中等大小的图片,但只在Chrome浏览器中加载失败。我有足够的磁盘空间。一旦我按照上述步骤操作,就可以成功加载。如果有足够的磁盘空间,为什么会发生这种情况?此外,仅使用nginx,而非docker。 - Raymond Carl
嗨 @nordicray!有时我在使用Chrome浏览器时会遇到缓存问题。您可以尝试禁用缓存或更改代码以避免缓存。 - mrroot5
2
“磁盘空间”是关键字! - matewka

42

这个错误是HTTP头中广告的数据与通过网络传输的数据之间明显的不匹配。

可能是以下原因导致:

  1. 服务器:如果服务器有某些模块的bug,在更改内容但没有在头部更新内容长度或只是无法正常工作时。曾经有过Node HTTP代理的情况(参见此处

  2. 代理:在您和服务器之间的任何代理可能会修改请求并未更新内容长度头。

据我所知,我没有看到IIS中出现过这些问题,但主要与自定义编写的代码有关。

让我知道这是否有帮助。


1
但是你如何强制Chrome忽略错误并仍然显示/渲染页面呢?整个文档已经传输完成,只是长度不匹配。它在Curl中可以工作(只是无法渲染)。 - Chloe
14
不要勉强。这就像止痛药一样,只能掩盖症状。找到问题的根本原因,解决它,享受一个更加健康的网络。 - Maxime Rouiller
2
服务器在一个旧路由器内部!我无法访问! - Chloe
HTTP头中广告的数据与实际数据之间存在明显的不匹配 - 这正是由于后端返回的无效JSON导致了这种情况发生在我身上。 - iLuvLogix
只需尝试刷新浏览器即可解决。 - klewis

39

这可能是由于您的广告屏蔽插件引起的。

尝试禁用它或为图片来源域名添加例外。


1
太对了!这是为什么呢?是因为广告拦截器将代码注入到每个被提取的文件中吗?如果是这样的话,那为什么不是每个请求的文件都会发生这种情况呢? - jahackbeth
其实我不知道广告拦截器的工作原理(这就是为什么我使用了条件语句)。也许与过滤器有关,因此代码不会注入到每个文件中,而只会注入到符合过滤器描述的特定模式的文件中。 - Joe Valeriana
哇,这个问题已经问了5年了。然而,它在我的情况下帮了我。 - user8795381

21

这可能是由于磁盘已满(Ubuntu/Nginx)引起的。

我的情况:


在我的情况下,磁盘并不满,但脚本很有用。可能是临时文件夹满了? - echo
1
@echo 如果tmp文件夹有自己的“磁盘”,那可能是这种情况吗?如果您使用“df -h”进行检查,应该能看到是否是这种情况?如果磁盘上有许多文件,也可能是因为您用完了inode(我相信“df -i”应该会显示是否是这种情况)。如果任何一个显示“磁盘已满”,清理一下可能会有所帮助 ;) - vdB

5
这是对我有效的方法。
        proxy_buffer_size   1M;
        proxy_buffers   4 1M;

我在nginix代理配置文件中增加了上述参数的大小。

在这里,nginix作为我的基于微服务的应用程序的代理运行。


1
添加proxy_buffer_size和proxy_buffers解决了我的问题。但是,似乎你的proxy_busy_buffers_size指令不完整。虽然在我的用例中不需要。 - Form

4

在我的情况下,我错误地计算了标头中宣传的Content-Length。我的文件服务支持Range-Requests,而我错误地将文件大小发布为Content-Length。

我通过将Content-Length设置为我向浏览器发送的实际范围来解决了这个问题。

因此,如果我正在回答普通请求,我将Content-Length设置为文件大小。如果我正在回答Range-Request,则将Content-Length设置为所请求范围的实际长度。


2
在我的情况下,我修改了请求以附加一个头部(使用 Fiddler)到一个 https 请求中,但我没有配置它来 解密 https 流量。 您可以从 Fiddler 中导出手动创建的证书,这样您就可以信任/导入证书到您的浏览器中。有关详细信息,请参见上面的链接,其中一些步骤包括:
  1. 单击“工具” > “Fiddler 选项”。
  2. 单击“HTTPS”选项卡。确保已选中“解密 HTTPS 流量”复选框。
  3. 单击“将 Fiddler 根证书导出到桌面”按钮。

1

这绝对与服务器上的磁盘空间有关,清除日志文件夹对我有用。按照以下步骤操作:

1. go to nginx log directory
   cd /var/log/nginx
2. delete all the older log
   rm *.gz               
3. emplty error log
   truncate -s 0 error.log.1 
4. empty access log
   truncate -s 0 access.log.1

0
在我的情况下,问题是代理问题(从nginx到varnish缓存的请求被代理)导致的。我需要将以下内容添加到我的代理定义中。
        proxy_set_header Connection keep-alive; 


我在这里找到了答案:https://dev59.com/210a5IYBdhLWcg3w68cz#55341260

0

对我来说,运行docker system prune -a就解决了问题。尽管重建容器或遵循@mrroot5的答案似乎可以实现类似的效果,但我没有成功。


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