在请求中包含 Via 标头时 IIS6 不执行 gzip 压缩

在请求中包含 Via 标头时 IIS6 不执行 gzip 压缩

我有一些静态内容通过 CDN 传输。我使用 IIS6 的内置压缩(gzip 和 deflate)来处理静态内容,当我请求时,它工作正常。但是,当 CDN 首次请求内容时,它并没有被压缩。因此,他们没有压缩内容可以转发给请求它的人。(是的,这引发了一个问题,即人们使用无法处理压缩的浏览器从 CDN 请求 [压缩的] 内容。不过,我们暂时先把这个问题放在一边。)

以下是没有“Via”标头的请求示例:

HEAD /flash/swfobject.js HTTP/1.1  
User-Agent: curl/7.19.7 (i386-pc-win32)  
Host: localhost:9120  
Accept: */*  
Connection: Keep-Alive  
accept-encoding: gzip  

并返回一个压缩的响应:

HTTP/1.1 200 OK
Content-Length: 4357
Content-Type: application/x-javascript
Content-Encoding: gzip
Expires: Wed, 01 Jan 2020 00:00:00 GMT
Last-Modified: Wed, 18 Nov 2009 15:36:52 GMT
Accept-Ranges: bytes
Vary: Accept-Encoding
Server: Microsoft-IIS/6.0
Date: Thu, 19 Nov 2009 10:27:50 GMT

但是,如果我在请求中包含“Via”标头(就像 CDN 所做的那样),那么结果将未压缩:

要求:

HEAD /flash/swfobject.js HTTP/1.1
User-Agent: curl/7.19.7 (i386-pc-win32)
Host: localhost:9120
Accept: */*
Connection: Keep-Alive
Via: 1.1 204.160.105.17:80 (Footprint 4.5/FPMCP)
accept-encoding: gzip

回复:

HTTP/1.1 200 OK
Content-Length: 14602
Content-Type: application/x-javascript
Expires: Wed, 01 Jan 2020 00:00:00 GMT
Last-Modified: Wed, 18 Nov 2009 15:36:54 GMT
Accept-Ranges: bytes
Server: Microsoft-IIS/6.0
Date: Thu, 19 Nov 2009 10:29:52 GMT

是的,这些演示在请求中使用了“localhost”。不过,我使用来自不同网络上的不同机器的实际域名得到了相同的结果。

那么,有两个问题:

  1. 这可能是因为 IIS 由于额外的标头而没有应用压缩吗?如果是这样,我该怎么办?

  2. 如何判断代理在返回内容之前是否正在解压缩内容?

附加问题:

  1. 我该怎么做才能进一步调查这个问题?

我知道问题 332049,但是响应中有标头,而不是请求中。

答案1

有点晚了,但是我在研究类似问题时遇到了这个问题,所以我想我可以参与进来。

IIS6 不对通过上游代理到达服务器的请求应用 HTTP 压缩。由于 HTTP 1.1 规范规定代理服务器必须添加“Via:”标头,因此 IIS 必须使用此标头来区分直接流量和代理流量。

如果需要,可以启用它,但我建议先进行测试。这种默认行为的声称原因是大多数代理不能很好地处理压缩内容。

参考:

TechNet:HcNoCompressionForProxies 元数据库属性(IIS 6.0)

HTTP/1.1 Via 标头字段

相关内容