NGINX 忽略哈希 css 文件并获取任何存在的 css

NGINX ignore hash css file and fetch any css that exists

我正在使用散列 css 文件 (app-123456.css) 进行缓存破坏。 css 文件请求被代理到带有 nginx 的 cdn。我需要在 cdn 上保持静态命名的文件,因为有要求允许客户修改一些 css 并重新上传文件。如何将散列文件请求传递给 cdn 和 return 静态命名文件?例如,对 app-123456.css 的请求将 return app.css,如果它存在于 cdn 上。我正在尝试使用试用文件,但没有成功。如果 returned 文件是静态命名的,缓存清除在这种情况下是否仍然有效?感谢您的帮助。

location ~* (.+)\.(?:\d+)\.(css)$ {
  try_files $uri . @styles;
}

location @styles {
  autoindex on;
  proxy_pass http://[url].net; # needs to go to http://[url].net/styles/
}

编辑

location ~* (.+)-(?:\d+)\.(css)$ {
  try_files $uri . @styles;
}

location @styles {
  autoindex on;
  rewrite ^(.+)-(?:\d+)\.(css)$ /styles. break;
  proxy_pass http://[url].net; # needs to go to http://[url].net/styles/
}

固定

^(.+)\-([a-zA-Z0-9]*)\.(css)$

您需要修改命名 location 中的 URI,然后再使用 proxy_pass 将其向上游传递。这可以使用 rewrite...break 语句来完成。有关详细信息,请参阅 this document

例如,使用更新后的正则表达式:

location ~* ^(.+)\-(?:[a-zA-Z0-9]*)\.(css)$ {
    try_files $uri . @styles;
}
location @styles {
    rewrite ^(.+)\-(?:[a-zA-Z0-9]*)\.(css)$ /styles. break;
    proxy_pass http://...;
}

上述解决方案基本上将相同的正则表达式应用于 URI 两次,这似乎效率低下且多余。

如果/styles/ URI 前缀对于上游服务器是唯一的,您可以在原始try_files 语句中执行转换。有关详细信息,请参阅 this document

例如:

location ~* ^(.+)\-(?:[a-zA-Z0-9]*)\.(css)$ {
    try_files $uri . /styles.$is_args$args;
}
location ^~ /styles/ {
    internal;
    proxy_pass http://...;
}

^~ 运算符赋予前缀 location 高优先级(有关详细信息,请参阅 this document for details) and the internal directive prevents the URI from being directly accessible (see this document)。