正则表达式查找匹配文件扩展名的文件,除非文件名包含字符串

mav*_*cko 5 regex nginx browser-cache regex-lookarounds nginx-location

我为 nginx 中的特定文件启用了缓存,如下所示:

location ~* \.(?:css|js)$ {
access_log off;
add_header Cache-Control "no-transform,public,max-age=31536000,s-max-age=31536000";
expires 1y;
}   
Run Code Online (Sandbox Code Playgroud)

我想在这里做的是排除所有与模式 i18n-*.js 匹配的文件,因此,缓存除以 i18n 开头的文件之外的所有 .js 文件。

我尝试进行否定查找以排除该模式,但由于非捕获组,它无法正常工作:

location ~* \.(?!i18n-.*\.js)(?:css|js)$ {
        access_log off;
        add_header Cache-Control "no-transform,public,max-age=31536000,s-max-age=31536000";
        expires 1y;
}
Run Code Online (Sandbox Code Playgroud)

这里的智能解决方案是什么?我不是正则表达式专家,所以简短的解释也会有帮助。

Ana*_*oly 5

官方文档描述了如何遍历位置树:

正则表达式会按照它们在配置文件中出现的顺序进行检查。正则表达式的搜索在第一次匹配时终止,并使用相应的配置。如果找不到与正则表达式的匹配项,则使用之前记住的前缀位置的配置。

基于此,配置如下:

location ~* \.(i18n-.*\.js)$ {
  access_log off;
  expires off;
}

location ~* \.(css|js)$ {
  access_log off;
  expires 1y;
  add_header Cache-Control public;
}  
Run Code Online (Sandbox Code Playgroud)

注意:正则表达式中的问号是多余的,除非用作变量docs

命名的正则表达式捕获可以稍后用作变量:

server {
  server_name   ~^(www\.)?(?<domain>.+)$;

  location / {
    root   /sites/$domain;
  }
}
Run Code Online (Sandbox Code Playgroud)

如果使用?:语法跳过捕获组,它们需要稍后使用,否则您可以删除以简化位置语法。