Nginx正则变量为空及未知变量报错,求重定向配置修正方案
Nginx苹果触摸图标重定向配置修正方案
问题分析
原配置报错unknown "1" variable且$2为空,核心原因是在if块的正则匹配条件中,无法直接引用location正则捕获的分组变量(如$2)。!~后的正则会被Nginx独立解析,其中的$2会被当作正则的反向引用而非Nginx变量,导致解析错误;同时这也会使$2无法正确传递捕获的文件名,出现为空的情况。
修正方案
推荐采用更安全的无if配置(Nginx的if存在场景陷阱,能避免则避免),以下两种方案均可实现需求:
方案一:分离匹配规则(推荐)
通过两个location分别处理目标文件请求和重定向,彻底避免循环和变量问题:
# 直接处理/assets目录下的苹果触摸图标请求,跳过重定向 location ~* ^/assets/apple-touch-icon(-[0-9]+x[0-9]+)?(-precomposed)?\.png$ { # 替换为你的静态文件根目录或别名配置 root /your/static/files/path; } # 重定向所有非/assets路径下的苹果触摸图标到/assets目录 location ~* ^(/[a-zA-Z-]+/)?apple-touch-icon(-[0-9]+x[0-9]+)?(-precomposed)?\.png$ { rewrite ^(/[a-zA-Z-]+/)?(apple-touch-icon(-[0-9]+x[0-9]+)?(-precomposed)?\.png)$ /assets/$2 permanent; }
方案二:修正原if逻辑
如果坚持使用原结构,可修改if的判断条件,直接检查请求路径是否以/assets/开头,避免在正则中引用变量:
location ~* ^(/[a-zA-Z-]+/)?(apple-touch-icon(-[0-9]+x[0-9]+)?(-precomposed)?\.png)$ { # 仅当请求路径不是/assets开头时执行重定向 if ($uri !~ ^/assets/) { return 301 /assets/$2; } # 处理/assets路径下的文件请求 root /your/static/files/path; }
效果说明
两种方案都能实现:
- 匹配所有带语言前缀(如
/en/、/en-us/)或不带前缀的苹果触摸图标请求 - 自动重定向到
/assets/目录下的对应文件 - 避免
/assets/路径下的请求触发重定向循环
内容的提问来源于stack exchange,提问作者AlexCs
相关产品推荐
相关产品推荐

