如果网络服务器可以发送 gzip 响应,为什么浏览器不能发送 gzip 请求?
6 回答
客户端和服务器必须就如何通信达成一致;部分原因是通信是否可以压缩。HTTP 被设计为请求/响应模型,最初的创建几乎可以肯定地设想总是有小请求和潜在的大响应。实现 HTTP不需要压缩,有服务器和客户端都不支持它。
HTTP 压缩是由客户端实现的,说它可以支持压缩,如果服务器在请求中看到它并且它支持压缩,它可以压缩响应。为了压缩请求,客户端必须有一个“预请求”,实际上协商请求将被压缩,或者它必须要求压缩作为所有请求的支持编码。
* 2017 年 2 月更新 * 已经 8 年了,但正如 @Phil_1984_ 所指出的,第三种可能的解决方案是客户端和服务器协商压缩支持,然后将其用于后续请求。事实上,像 HSTS 这样的东西就是这样与客户端缓存一起工作的,服务器期望只使用 TLS 并忽略任何未加密的链接。HTTP 被明确设计为无状态,但我们现在已经超越了这一点。
客户端无法提前知道服务器会理解压缩后的请求,但服务器可以知道客户端会接受请求。
它可以,只要它可以保证服务器会接受它。这可能意味着使用 OPTIONS 请求。
Web 浏览器可以做很多他们不做的事情(例如,流水线)。Web 浏览器开发人员考虑更改的兼容性影响。
在异构环境中,有许多不同的 Web 服务器和配置。改变客户的工作方式可能会破坏其中的一些。
也许只有 1% 的服务器可能会接受 gzip 压缩请求,但也许其中一些服务器宣传他们接受,但无法正确接受 - 因此用户将被拒绝将文件上传到这些站点。
从历史上看,有很多损坏的客户端/服务器实现 - 很长一段时间以来,主要 Web 浏览器中的 gzip 响应都被破坏了(谢天谢地,这些现在大部分都消失了)。
因此,您最终会得到自动关闭这些选项的用户代理或服务器(或域名)的黑名单,这很讨厌。
因为它不知道服务器可以接受它。HTTP 事务具有由客户端发送的单个请求,然后是响应。客户端发送的其中一件事是它可以支持什么编码/压缩。然后服务器可以决定如何压缩响应。客户没有这种奢侈。
如果您正在编写一个 Web 应用程序,我假设您可以控制发送给客户端的内容以及从客户端发送回的内容。
用 javascript 编写一个 gzip 实现会很容易,它可以压缩发送到服务器的发布数据。服务器可以有一个过滤器(j2ee 术语),它知道客户端数据是压缩发送的,这个过滤器解压缩数据,然后将数据传递给 servlet(或 Struts 中的操作类),它可以正常读取数据,例如 request.getParameter( ...)。
如果您可以控制,这似乎完全合乎逻辑且可行。正如其他帖子所提到的,您不能依靠浏览器自动执行此操作,但是由于您正在编写网页,因此您可以让浏览器进行您所追求的压缩(只需做一些工作)。
安迪。
HTTP 是这样设计的:
- 客户以纯文本形式表示其请求(包括是否可以理解压缩答案)
- 服务器使用适当的编码响应(压缩与否)
但是在这个设计中,客户端不能发送压缩请求,因为它不知道服务器是否会提前理解它。