【问题标题】:How to Specify "Vary: Accept-Encoding" header in .htaccess如何在 .htaccess 中指定“Vary: Accept-Encoding”标头
【发布时间】:2011-04-08 03:48:33
【问题描述】:

Google PageSpeed 说我应该为 JS 和 CSS “指定一个 Vary:Accept-Encoding 标头”。如何在 .htaccess 中执行此操作?

【问题讨论】:

  • 不知道为什么关闭它,仅仅因为它不涉及编程语言并不意味着它与编码无关。
  • @BlueRaja-DannyPflughoeft 我同意,这已被查看超过 65100 次,所以我认为这是一个很好的搜索主题,更不用说我每天都回答 htaccess 问题。
  • 我知道这很糟糕,但是标题 Vary: Accept-Encoding 会告诉浏览器在缓存中存储基于 Content-Encoding 标题的页面版本。你应该看到stackoverflow.com/questions/1975416/…developers.google.com/speed/docs/best-practices/…
  • @IsmaelMiguel 它实际上会告诉客户端(更重要的是,途中的任何缓存服务器),对于客户端的每个变体,该文件都不同s Accept-Encoding` 请求标头值,而不是服务器响应标头值的每个Content-Encoding 变体。
  • @BlueRaja-DannyPflughoeft 因为有很多声誉的用户和寻求声誉的用户通过寻找问题来建立声誉。令人沮丧的是,它经常导致不应该关闭的问题。

标签: .htaccess pagespeed


【解决方案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" 为我解决了这个问题。

      我会在帖子下方发表评论,但它似乎不会让我这样做。

      无论如何,我希望这能避免遇到同样的麻烦。

      【讨论】:

      【解决方案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 主机中的一些错误(可选)。

          【讨论】:

            猜你喜欢
            • 2013-05-14
            • 2012-06-18
            • 2018-05-02
            • 2011-03-08
            • 2011-09-06
            • 2017-08-27
            • 2013-01-10
            • 1970-01-01
            • 2015-04-20
            相关资源
            最近更新 更多