【问题标题】:Set Vary: Accept-Encoding Header (nginx)设置变化:接受编码标头(nginx)
【发布时间】:2011-10-02 00:49:26
【问题描述】:

我有一个 nginx 服务器,但似乎找不到任何有关如何发送 Vary: Accept-Encoding CSS 和 JS 文件的标头的信息。有人知道这方面的信息吗?

谢谢!

【问题讨论】:

    标签: nginx


    【解决方案1】:

    这是来自 nginx documentation

    gzip_vary
    syntax: gzip_vary on|off
    default: gzip_vary off
    context: http, server, location
    

    启用"Vary: Accept-Encoding" 的响应标头。请注意,这 标头导致 IE 4-6 由于错误而无法缓存内容(请参阅 2 )。

    如果您只添加gzip_vary on;,它应该可以完成它的工作。

    还要确保您有任何一个 gzip、gzip_static 或 gunzip 指令处于活动状态。

    【讨论】:

    • 我认为这不是正确的答案 - 至少,不是唯一的,也许不是所有的 nginx 版本(这个我说不出来)。如果 gzip_vary 关闭,单独的 gzip_vary 将启用 gzip,但将保留默认 gzip_types,并且不会为不同于默认 text/html mimetype 的资源启用 Vary。 nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip(在 nginx 1.4.6 上测试)
    • @AlanFranzoni 这个问题与启用 gzip 或使其对其他内容类型进行编码无关,只是添加了可变标头。
    • @jbg 我想你误解了 Vary 的用途,它通常与压缩一起使用(查看fastly.com/blog/best-practices-for-using-the-vary-header)。如果gzip和vary没有任何关系,为什么nginx选项会叫gzip_vary?
    • 我非常了解 Vary HTTP 标头的用途。我的观点是,该问题没有询问如何打开 gzip 压缩(他们很可能已经打开了它),并且您声称直接回答所提出的确切(相当狭窄)问题的答案是“不正确答案”是荒谬的。
    • 我确实测试了答案。我已经正确设置了 gzip,包括内容类型,我来这里是为了了解如何发送“Vary: Accept-Encoding”标头。这个答案完美地回答了所陈述的问题,并且大概提问者同意了,因为他们接受了。
    【解决方案2】:

    在你要设置的域/子域的server {里面,添加

        gzip on;
        gzip_min_length  1100;
        gzip_buffers  4 32k;
        gzip_types    text/plain application/x-javascript text/xml text/css;
        gzip_vary on;
    

    保存文件并重启nginx。

    【讨论】:

    • 据我所知,这是唯一正确的答案。 gzip_types 是这里的关键,因为默认只是 text/html,因此不会为不同的内容类型启用变化。
    • 在我的 nginx 服务器上的 vhost 文件中运行良好。谢谢!
    • 这应该是正确的答案。 gzip_types 应该取消注释。仅打开 gzip_vary 是不够的;正如其他人所建议的那样。
    【解决方案3】:

    简单。在 Nginx 配置中:

    vim /etc/nginx/nginx.conf
    

    在该部分的底部附近添加以下内容:

        ##
        # Gzip Settings
        ##
    
        gzip on;
        gzip_disable "msie6";
    
        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
    

    只需取消注释gzip_vary on;参数并重新启动或重新加载nginx服务:

    service nginx restart
    

    这应该可以解决问题。如果您运行的是旧版本的 nginx,您可能需要启用 gzip on;,因为这是可变标头工作所必需的。

    我希望这会有所帮助。仅供参考,这适用于所有服务器/站点配置文件,除非在它们各自的服务器块中被覆盖。 server {}

    nginx、apache 和 IIS 的源信息:https://www.maxcdn.com/blog/accept-encoding-its-vary-important/

    【讨论】:

    • 禁用 gzip_types 会带来更多问题。
    【解决方案4】:

    如果您已经尝试了其他答案并且仍然发现变化不大(例如,如果您正在使用 GTMetrix 测试页面的速度),那么以下方法可能会有所帮助:

    确保您的所有 gzip_types 也在 /etc/nginx/nginx.conf http 部分中设置。

    /etc/nginx/sites-available/* 中的服务器块是您可以设置不同标头和 gzip_types 的地方,但根据您的站点设置方式,您可能会在文件到达之前处理和返回文件一点配置。

    在 /etc/nginx/nginx.conf 中,您会找到一个“http”部分 - 在这里,还有一个 gzip_types 和 gzip_vary。

    对我来说 - CSS 和 JS 是静态文件,在点击 (wordpress) nginx 站点可用文件(我前面有清漆)之前已经提供了服务。

    因此,将 gzip_types 的完整列表添加到 nginx.conf 中的 http 部分解决了我的问题。

    【讨论】:

    • 你能帮我弄清楚你做了什么吗?我在 GTMetric 上也看到了同样的情况,而且我也在使用 wordpress,但我总是看到我在该指标上得分很低。你是怎么解决的?
    猜你喜欢
    • 1970-01-01
    • 2015-06-23
    • 2011-12-12
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多