Nginx 在可能时提供另一个文件

Nginx 在可能时提供另一个文件

我目前使用 Webpack 的 BrotliPlugin 编译我的资产,它会创建一个单独的文件,brotli-encoded,即:

  • style.css
  • style.cssb

这是我想要实现的目标:考虑 HTML 页面请求style.css

如果

  • 用户发送br到其Accept-Encoding请求标头的
  • 并且相应的 brotli 文件存在(style.cssb在本例中):

然后

  • 提供相应的 brotli 文件内容style.cssb
  • 带有Content-Type: text/css响应头
  • 带有Content-Encoding: br响应头

否则

  • 正常行事,只需服务style.css

以下是我目前的配置的一部分:

map $http_accept_encoding $accepts_brotli {
    default false;
    "~*br" true;
}
location ~* (.*).(css|js)$ {
    set $brotli_uri "${uri}b";
    set $brotli_file "${request_filename}b";
    set $should_use_brotli "";
    if ($accepts_brotli = true) {
        set $should_use_brotli "Y";
    }
    if (-f $brotli_file) {
        set $should_use_brotli "${should_use_brotli}Y";
    }
    if ($should_use_brotli = YY) {
        add_header X-URI $brotli_uri;
        add_header Content-Encoding br;
    }

    add_header X-FOO "bar";
    try_files $brotli_uri $uri;
}

结果:

  • 响应中存在 X-URI
  • X-FOO 不是
  • 仍提供未压缩的内容

我究竟做错了什么?

相关内容