![当 Accept-Encoding 为 gzip 或 deflate 时,响应标头中不显示 Content-Encoding](https://linux22.com/image/550210/%E5%BD%93%20Accept-Encoding%20%E4%B8%BA%20gzip%20%E6%88%96%20deflate%20%E6%97%B6%EF%BC%8C%E5%93%8D%E5%BA%94%E6%A0%87%E5%A4%B4%E4%B8%AD%E4%B8%8D%E6%98%BE%E7%A4%BA%20Content-Encoding.png)
我使用的是 Firefox,当我将 设置Accept-Encoding
为时,deflate,gzip
我会Content-Encoding: gzip
在响应标头中看到。当我使用Accept-Encoding
或deflate
时,gzip
会Content-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