将 SVG 用作 GZIP 不会在后续请求中缓存它

将 SVG 用作 GZIP 不会在后续请求中缓存它
  • 操作系统:Ubuntu 14.04
  • 阿帕奇:2.4.12(使用 PPA) -mod_expires、mod_headers

我对所有 SVG 文件都使用 GZIP。它与配置文件(不是 .htaccess)中的以下语句配合得很好

AddType image/svg+xml .svg
AddOutputFilterByType DEFLATE image/svg+xml

但是,按下 F5 键后,浏览器会向服务器请求文件并返回200状态代码未返回预期304状态代码。

如果我删除按类型添加输出过滤器然后服务器返回304但内容并未经过 GZIP 压缩。

以下是一些原始请求标头

无 GZIP(200 状态代码)

Accept-Ranges: bytes
Cache-Control: max-age=2592000
Connection: Keep-Alive
Content-Length: 689
Content-Type: image/svg+xml
Date: Thu, 02 Jul 2015 10:41:09 GMT
Etag: "2b1-5157f331b2480"
Expires: Sat, 01 Aug 2015 10:41:09 GMT
Keep-Alive: timeout=5, max=80
Last-Modified: Thu, 07 May 2015 15:02:26 GMT
Server: Apache

无 GZIP(304 状态代码)

Cache-Control: max-age=2592000
Connection: Keep-Alive
Date: Thu, 02 Jul 2015 10:39:12 GMT
Etag: "2b1-5157f331b2480"
Expires: Sat, 01 Aug 2015 10:39:12 GMT
Keep-Alive: timeout=5, max=71
Server: Apache

使用 GZIP

Accept-Ranges: bytes
Cache-Control: max-age=2592000
Connection: Keep-Alive
Content-Encoding: gzip
Content-Length: 451
Content-Type: image/svg+xml
Date: Thu, 02 Jul 2015 10:38:45 GMT
Etag: "2b1-5157f331b2480-gzip"
Expires: Sat, 01 Aug 2015 10:38:45 GMT
Keep-Alive: timeout=5, max=75
Last-Modified: Thu, 07 May 2015 15:02:26 GMT
Server: Apache
Vary: Accept-Encoding

谢谢你!

答案1

这是 Apache 的一个错误,它无法正确处理 gzip 内容的 Etag。可以通过关闭 gzip(正如您所注意到的 - 但性能会受到影响)或关闭 ETag(并依赖于 304 的 Last-Modified 标头 - 因此没有实际损失)来解决。我更喜欢关闭 ETag。

还有另一种选择(DeflateAlterETag),但仅限于 Apache 2.5,而且对我来说这似乎是一种捏造。

更多详情请点击这里:为什么当 Last-modified 与 If-modified-since 匹配时 Apache 会发送 200 OK?

相关内容