当 Accept-Encoding 为 gzip 或 deflate 时,响应标头中不显示 Content-Encoding

当 Accept-Encoding 为 gzip 或 deflate 时,响应标头中不显示 Content-Encoding

我使用的是 Firefox,当我将 设置Accept-Encoding为时,deflate,gzip我会Content-Encoding: gzip在响应标头中看到。当我使用Accept-Encodingdeflate时,gzipContent-Encoding从标头中删除。

有人能解释一下为什么吗?我需要考虑任何 Apache 配置吗?

答案1

如果你正在提供 .gz 文件,也许你希望在文件扩展名和所需的 mime 类型之间添加关联mod_mime. 可以将以下内容添加到 VirtualHost 配置中。

AddEncoding x-gzip .gz

或者,更完整的例子用于提供预压缩内容的配置不仅涉及添加编码类型,还涉及禁用 mod_deflate 并重置内容类型。此示例使用 mod_header 添加编码类型。

<IfModule mod_headers.c>
    # Serve gzip compressed CSS files if they exist 
    # and the client accepts gzip.
    RewriteCond "%{HTTP:Accept-encoding}" "gzip"
    RewriteCond "%{DOCUMENT_ROOT}%{REQUEST_FILENAME}\.gz" -s
    RewriteRule "^(.*)\.css" "$1\.css\.gz" [QSA]

    # Serve gzip compressed JS files if they exist 
    # and the client accepts gzip.
    RewriteCond "%{HTTP:Accept-encoding}" "gzip"
    RewriteCond "%{DOCUMENT_ROOT}%{REQUEST_FILENAME}\.gz" -s
    RewriteRule "^(.*)\.js" "$1\.js\.gz" [QSA]


    # Serve correct content types, and prevent mod_deflate double gzip.
    RewriteRule "\.css\.gz$" "-" [T=text/css,E=no-gzip:1]
    RewriteRule "\.js\.gz$" "-" [T=text/javascript,E=no-gzip:1]


    <FilesMatch "(\.js\.gz|\.css\.gz)$">
      # Serve correct encoding type.
      Header append Content-Encoding gzip

      # Force proxies to cache gzipped & 
      # non-gzipped css/js files separately.
      Header append Vary Accept-Encoding
    </FilesMatch>
</IfModule>

(请注意,上面从引用的示例中将 DOCUMENT_ROOT 添加到 RewriteCond 文件路径中,因为我相信在 2.2+ 版的 VirtualHost 上下文中使用时需要它。)

答案2

请参阅 RFC,它提供了有关在 Accept-Encoding 中可以使用哪些值的详细信息,以及服务器如何根据 Accept-Encoding 字段使用这些规则测试内容编码是否可接受,

https://www.rfc-editor.org/rfc/rfc9110.html#name-accept-encoding

相关内容