如何在 .htaccess 中指定“Vary: Accept-Encoding”标头
Posted
技术标签:
【中文标题】如何在 .htaccess 中指定“Vary: Accept-Encoding”标头【英文标题】:How to Specify "Vary: Accept-Encoding" header in .htaccess 【发布时间】:2011-04-08 03:48:33 【问题描述】:Google PageSpeed 说我应该为 JS 和 CSS “指定一个 Vary:Accept-Encoding 标头”。如何在 .htaccess 中执行此操作?
【问题讨论】:
不知道为什么关闭它,仅仅因为它不涉及编程语言并不意味着它与编码无关。 @BlueRaja-DannyPflughoeft 我同意,这已被查看超过 65100 次,所以我认为这是一个很好的搜索主题,更不用说我每天都回答 htaccess 问题。 我知道这很糟糕,但是标题Vary: Accept-Encoding
会告诉浏览器在缓存中存储基于 Content-Encoding
标题的页面版本。你应该看到***.com/questions/1975416/… 和developers.google.com/speed/docs/best-practices/…
@IsmaelMiguel 它实际上会告诉客户端(更重要的是,途中的任何缓存服务器),对于客户端的每个变体,该文件都不同s
Accept-Encoding` 请求标头值,而不是服务器响应标头值的每个Content-Encoding
变体。
@BlueRaja-DannyPflughoeft 因为有很多声誉的用户和寻求声誉的用户通过寻找问题来建立声誉。令人沮丧的是,它经常导致不应该关闭的问题。
【参考方案1】:
我猜这意味着您为您的 css 和 js 文件启用 gzip 压缩,因为这将使客户端能够接收 gzip 编码的内容和纯内容。
这是在apache2中的做法:
<IfModule mod_deflate.c>
#The following line is enough for .js and .css
AddOutputFilter DEFLATE js css
#The following line also enables compression by file content type, for the following list of Content-Type:s
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml
#The following lines are to avoid bugs with some browsers
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
</IfModule>
下面是添加 Vary Accept-Encoding
标头的方法:[src]
<IfModule mod_headers.c>
<FilesMatch "\.(js|css|xml|gz)$">
Header append Vary: Accept-Encoding
</FilesMatch>
</IfModule>
Vary:
标头告诉该 url 提供的内容将根据某个请求标头的值而变化。这里它说它将为说他们Accept-Encoding: gzip, deflate
(请求标头)的客户提供不同的内容,而不是为不发送此标头的客户提供的内容。 AFAIK 的主要优点是让中间缓存代理知道由于这种变化,它们需要具有相同 url 的两个不同版本。
【讨论】:
我不认为是这样。我的 JS 和 CSS 已经被压缩了。 PageSpeed 还在抱怨。 我认为 mod_deflate 是 supposed 默认发送 Vary 标头。 我已经做了你上面提到的。 .js 文件仍未被压缩。 @Andy;也许您的服务器没有“mod_deflate.c”模块。 Apache 2.2 不需要上述答案中的 mod_headers 部分。 mod_deflate 已经做了你需要的。 httpd.apache.org/docs/2.2/mod/mod_deflate.html【参考方案2】:恐怕 Aularon 没有提供足够的步骤来完成该过程。通过一些尝试和错误,我能够在我的专用 WHM 服务器上成功启用 Gzipping。
以下是步骤:
在 WHM 中运行 EasyApache,在 Exhaustive Options 列表中选择 Deflate,然后重建服务器。
完成后,转到服务配置 >> Apache 配置 >> 包含编辑器 >> 发布 VirtualHost 包含,选择所有版本,然后将 mod_headers.c 和 mod_headers.c 代码(在 Aularon 的帖子中列出)粘贴到输入字段中的另一个顶部。
保存后,我看到平均节省了 75.36% 的数据!您可以使用此 HTTP 压缩工具运行前后测试以查看您自己的结果:http://www.whatsmyip.org/http_compression/
希望这对大家有用!
马特【讨论】:
【参考方案3】:也可以压缩你的字体文件!
add "x-font/otf x-font/ttf x-font/eot"
如:
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml x-font/otf x-font/ttf x-font/eot
【讨论】:
【参考方案4】:这让我发疯,但似乎 aularon 的编辑在 "Vary"
之后缺少冒号。所以将"Vary Accept-Encoding"
更改为"Vary: Accept-Encoding"
为我解决了这个问题。
我会在帖子下方发表评论,但它似乎不会让我这样做。
无论如何,我希望这能避免遇到同样的麻烦。
【讨论】:
你确定这会有所作为吗?在 2.2 文档中,没有一个示例包含冒号:httpd.apache.org/docs/2.2/mod/mod_headers.html【参考方案5】:花了很多时间来澄清那是什么。请阅读this post 以获取高级.HTACCESS
代码并了解它们的作用。
你可以使用:
Header append Vary "Accept-Encoding"
#or
Header set Vary "Accept-Encoding"
【讨论】:
【参考方案6】:如果有人需要 nginx
配置文件,这里是 sn-p:
location ~* \.(js|css|xml|gz)$
add_header Vary "Accept-Encoding";
(... other headers or rules ...)
【讨论】:
【参考方案7】:无需指定甚至检查文件是否已压缩, 您可以根据每个请求将其发送到每个文件。
它告诉下游代理如何匹配未来的请求头来决定 是否可以使用缓存的响应而不是请求新的响应 一个来自源服务器。
<ifModule mod_headers.c>
Header unset Vary
Header set Vary "Accept-Encoding, X-HTTP-Method-Override, X-Forwarded-For, Remote-Address, X-Real-IP, X-Forwarded-Proto, X-Forwarded-Host, X-Forwarded-Port, X-Forwarded-Server"
</ifModule>
unset
用于修复旧版 GoDaddy 主机中的一些错误(可选)。
【讨论】:
以上是关于如何在 .htaccess 中指定“Vary: Accept-Encoding”标头的主要内容,如果未能解决你的问题,请参考以下文章
如何在 RSACryptoServiceProvider .NET 类中指定公钥