浏览器为何无法发送gzip请求?


Answers:


61

客户端和服务器必须就如何进行通信达成共识;部分原因在于通信是否可以压缩。HTTP被设计为请求/响应模型,几乎可以肯定的是,最初的创建总是具有较小的请求和可能较大的响应。实施HTTP不需要压缩,因为服务器和客户端都不支持压缩。

HTTP压缩由客户端实现,它说它可以支持压缩,并且如果服务器在请求中看到了此消息并且支持压缩,则可以压缩响应。为了压缩请求,客户端必须具有一个“ pre-request”,该“ pre-request”实际上协商将请求压缩为压缩请求,或者它需要压缩作为所有请求的受支持编码。

*更新时间:172月*已经8年了,但是正如@ Phil_1984_指出的那样,第三个可能的解决方案是让客户端和服务器协商压缩支持,然后将其用于后续请求。实际上,HSTS之类的事情就是通过客户端缓存来实现的,服务器希望客户端仅讲TLS,而忽略任何未加密的链接。HTTP被明确设计为无状态的,但我们已经超越了这一点。


那么,如果服务器不支持压缩,则将导致服务器故障吗?
jjxtra 2014年

2
“规范不要求压缩,服务器和客户端都不支持压缩。” 客户首先说:“嘿,我说法语,是吗?” 服务器根据是否知道法语进行响应并以英语或法语回答。在此示例中,法语是压缩。如果OP要求客户能够立即开始使用法语通话,则所有服务器都必须使用法语,否则系统将崩溃。该系统仅允许压缩响应,这恰恰是因为它需要协商并且两个系统都同意。
Peter Oehlert 2014年

1
很好解释。通常,在请求量较小的情况下,压缩不会超过请求前协商的压缩量。
罗恩

1
第三个选项(通常会丢失)是让客户端/浏览器记住服务器接受压缩,然后在需要时稍后在连接中发布压缩数据。无论如何,在连接服务器时,发布大型有效负载绝不是浏览器要做的第一件事。
菲尔(Phil)

1
@ Phil_1984_我认为历史背景很有帮助;很容易忘记我们走了多远。1989年,当HTTP被设计为无状态时,以高达20MHz的频率运行的486曾被宣布,尽管直到第二年春天才真正可用。互联网并不是真正从连接大学和政府的学术领域发展而来的。无状态在当时很有道理。随着代理(浏览器)在过去28年变得越来越复杂,添加更多有状态功能是有意义的,尤其是实现HSTS起源的特定用例。
Peter Oehlert

27

客户端无法预先知道服务器可以理解gzip压缩的请求,但是服务器可以知道客户端将接受一个请求。


25
不对。内容编码是允许客户端提供的标头。RFC表示:“如果请求消息中实体的内容编码对原始服务器不可接受,则服务器应以状态代码415(不支持的媒体类型)进行响应。” -每尼克约翰逊
Pacerier

11
您的意思与我开车时的意思有些不同。您可以尝试按照建议的方式发送压缩请求,但是无法事先知道服务器将接受该请求(无需与服务器对话)。就是说,您的观点很明确:如果您尝试发送gzip压缩的请求,则可能会发现服务器可以支持它。
保罗·迪克森

6
您可以在很多地方预先知道服务器支持该功能。例如,移动应用与后端通话。
吉列尔莫

1
是否有实际上支持压缩请求的服务器列表?
埃里克

是否有任何浏览器支持它?
布雷迪·莫里兹

7

只要可以保证服务器可以接受它,它就可以。这可能意味着使用OPTIONS请求。

Web浏览器可以执行许多其他操作,而不能完成(例如,流水线操作)。Web浏览器开发人员考虑了更改的兼容性影响。

在异构环境中,有许多不同的Web服务器和配置。改变客户的工作方式可能会破坏其中的一些。

也许只有1%的服务器可以接受压缩的请求,但是其中一些可能会宣传它们确实接受了请求,但不能正确接受-因此,将拒绝用户将文件上传到那些站点。

从历史上看,有很多损坏的客户端/服务器实现-很长一段时间以来,主要的Web浏览器中的压缩响应都被破坏了(幸运的是,这些响应现在大部分都消失了)。

因此,您最终会获得自动关闭这些选项的用户代理或服务器(或域名)黑名单,这很麻烦。


3

因为它不知道服务器可以接受它。HTTP事务具有一个由客户端发送的单个请求,然后是一个响应。客户端发送的内容之一是它可以支持哪种编码/压缩。然后,服务器可以决定如何压缩响应。客户没有这种奢侈。


好吧,如果服务器可以确定浏览器是否支持它,那么服务器是否可以理解g压缩的内容就可以找到浏览器试图找到的实现。如果开发人员致力于这一工作。
David Refoua 2014年

服务器确定浏览器支持gzip,因为浏览器只是通过Accept-Encoding请求标头告知它。您需要浏览器以其他方式先验地了解服务器的功能。这样做超出了HTTP / 1.1的范围。
Yuliy 2014年

@Yuliy您的意思是(例如)使用浏览器内存记住服务器的“接受编码”响应?
菲尔(Phil)

2

如果您正在编写Web应用程序,那么我假设您可以控制发送给客户端的内容以及从客户端发回的内容。

用javascript编写gzip实现很容易,它将压缩发送到服务器的数据。服务器可能有一个过滤器(j2ee术语),它知道客户端数据是压缩发送的,该过滤器对数据进行解压缩,然后将数据传递到servlet(或Struts中的动作类),该servlet可以正常读取数据,例如request.getParameter( ...)。

如果您处于控制之中,这似乎是完全合乎逻辑且可行的。就像其他帖子提到的那样,您不能依靠浏览器来自动执行此操作,但是由于您正在编写网页,因此可以使浏览器执行您要执行的压缩(只需做一些工作)。

安迪


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.