如何在.htaccess中指定“变化:接受编码”标头


81

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


22
不知道为什么关闭它,仅仅是因为它不涉及编程语言,并不意味着它与编码无关。
BlueRaja-Danny Pflughoeft13年

@ BlueRaja-DannyPflughoeft我同意,已被超过65100次查看,所以我认为这是一个很好搜索的话题,更不用说我每天回答htaccess的问题了。
巴拿马杰克

我知道这很糟糕,但是标题Vary: Accept-Encoding会告诉浏览器在缓存中存储基于Content-Encoding标题的页面版本。您应该看到stackoverflow.com/questions/1975416/...developers.google.com/speed/docs/best-practices/...
伊斯梅尔·米格尔

2
@IsmaelMiguel实际上会告诉客户端(更重要的是,途中的所有缓存服务器),该文件针对客户端s Accept-Encoding`请求标头值的每个Content-Encoding变量,而不是服务器响应标头值的每个变量而有所不同。
2014年

@ BlueRaja-DannyPflughoeft因为拥有很多声誉的用户和寻求声誉的用户都通过寻找问题来建立声誉,从而关闭声誉。令人沮丧的是,它常常导致关闭不应该关闭的问题。
Dan Nissenbaum '17

Answers:


89

我想这意味着您要为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仍在抱怨。
StackOverflowNewbie

3
我认为mod_deflate应该默认发送Vary标头。
Matthew Flaschen

我已经做了你上面提到的。.js文件仍然没有被压缩。
安迪N

@安迪; 也许您的服务器没有“ mod_deflate.c”模块。
2011年

3
Apache 2.2不需要以上答案中的mod_headers部分。mod_deflate已经可以满足您的需求。httpd.apache.org/docs/2.2/mod/mod_deflate.html
Ari Maniatis

4

恐怕Aularon没有提供足够的步骤来完成该过程。经过几次尝试和错误,我能够在专用WHM服务器上成功启用Gziping。

步骤如下:

  • 在WHM中运行EasyApache,在“详尽选项”列表中选择Deflate,然后重建服务器。

  • 完成后,转到服务配置>> Apache配置>>包括编辑器>>发布VirtualHost Include,选择“所有版本”,然后将mod_headers.c和mod_headers.c代码(上面在Aularon的文章中列出)粘贴到另一个输入字段。

  • 保存后,我平均节省了75.36%的数据!您可以使用此HTTP压缩工具运行测试前后,以查看自己的结果:http : //www.whatsmyip.org/http_compression/

希望这对大家有用!

  • 马特

3

也要gzip压缩字体文件!

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

2

花了很多时间来澄清那是什么。请阅读这篇文章以获得高级.HTACCESS代码并了解它们的作用。

您可以使用:

Header append Vary "Accept-Encoding"
#or
Header set Vary "Accept-Encoding"

1

这让我发疯了,但是之后看来Aularon的编辑缺少了冒号"Vary"。因此"Vary Accept-Encoding""Vary: Accept-Encoding"为我解决此问题。

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

无论如何,我希望这可以为我省下同样的麻烦。


2
您确定这有所作为吗?在2.2文档中,没有一个示例包含冒号:httpd.apache.org/docs/2.2/mod/mod_headers.html
Nic Cottrell

1

如果有人需要此NGINX配置文件,则以下是代码段:

location ~* \.(js|css|xml|gz)$ {
    add_header Vary "Accept-Encoding";
    (... other headers or rules ...)
}

0

无需指定甚至检查文件是否已压缩,您可以根据每个请求将其发送到每个文件。

它告诉下游代理如何匹配将来的请求标头,以决定是否可以使用缓存的响应,而不是从原始服务器请求一个新的响应。

<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托管中的一些错误的方法。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.