nginx中的变量与regex是空的

nzkunb0c  于 2023-11-17  发布在  Nginx
关注(0)|答案(1)|浏览(148)

我在nginx中有这段代码,我需要将不同的路径重定向到相应的文件,例如:

/apple-touch-icon.png
/apple-touch-icon-72x72.png
/en/apple-touch-icon.png
/en/apple-touch-icon-72x72.png
/en-us/apple-touch-icon.png
/en-us/apple-touch-icon-72x72.png

字符串
图标位于/assets/文件夹中
我有一个条件来防止nginx在重定向到assets文件夹时循环

location ~* ^/([a-zA-Z-]+/)?(apple-touch-icon(-[0-9]+x[0-9]+)?(-precomposed)?\.png)$ {
  if ($uri !~ ^/assets/$2) {
    return 301 /assets/$2;
  }
}


但是变量$1给了我这个错误

nginx: [emerg] unknown "1" variable


变量$2为空
有什么想法我可以让这个代码工作吗?谢谢

3pvhb19x

3pvhb19x1#

每个正则表达式在被Nginx求值时会覆盖前一个正则表达式的数值捕获。如果它不包含括号(没有捕获),则关联的数值变量将为空。
因此,您的if块是第二个正则表达式,它重置了第一个正则表达式生成的所有数字捕获,这意味着您的第一个$2包含来自location语句的值,而第二个$2为空。
正则表达式的问题可以通过命名捕获来解决,例如:(?<name> ... ),然后稍后将其用作$name
通过添加特定的location来处理开始为/assets/的URI,可以解决示例中的问题,例如:

location ~* ^/([a-zA-Z-]+/)?(apple-touch-icon(-[0-9]+x[0-9]+)?(-precomposed)?\.png)$ {
    return 301 /assets/$2;
}
location ^~ /assets/ {
}

字符串
注意^~操作符,这意味着这个 * 前缀位置 * 优先于任何 * 正则表达式位置 *。请参阅位置手册页。

相关问题