如何在 .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”标头的主要内容,如果未能解决你的问题,请参考以下文章

如何在类型提示中指定函数类型?

如何在 HTML 的图例中指定不同的形状?

如何在 RSACryptoServiceProvider .NET 类中指定公钥

如何在 HibernateJpaAutoConfiguration 中指定 packagesToScan?

Postgres:如何在where语句中指定参数[重复]

如何在 web.config 中指定根 (/) 位置?