You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 23:07:19