我在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
为空
有什么想法我可以让这个代码工作吗?谢谢
1条答案
按热度按时间3pvhb19x1#
每个正则表达式在被Nginx求值时会覆盖前一个正则表达式的数值捕获。如果它不包含括号(没有捕获),则关联的数值变量将为空。
因此,您的
if
块是第二个正则表达式,它重置了第一个正则表达式生成的所有数字捕获,这意味着您的第一个$2
包含来自location
语句的值,而第二个$2
为空。正则表达式的问题可以通过命名捕获来解决,例如:
(?<name> ... )
,然后稍后将其用作$name
。通过添加特定的
location
来处理开始为/assets/
的URI,可以解决示例中的问题,例如:字符串
注意
^~
操作符,这意味着这个 * 前缀位置 * 优先于任何 * 正则表达式位置 *。请参阅位置手册页。