无法在 nginx 的 “if” 正则表达式中使用变量?

背景

公司为所有县域电视台开发了一套新媒体管理后台系统,为每个电视台使用唯一的 Token 作为标识。现针对电视台的微信投票日志做统计,其中需要把投票用户的 Cookie 记录到 Nginx 投票日志中,但用户的 Cookie 键名中有电视台 Token 做标识,所以在 Nginx 中加入正则进行匹配 Cookie 变量名的操作。

代码实现

  1. 首先在 Nginx 的主配置文件 nginx.conf 中定义好 log_format 日志格式,这里展示一些主要的日志配置信息
    log_format cookie_log '$time_local -- $remote_addr -- "$host" -- ... -- "$http_x_forwarded_for" -- $union_cookie -- $http_cookie';
  2. 在 Server 块中对获取 Cookie 进行相关配置

    sever {
            ...
            access_log /var/log/access_log union_log;
    
            set_unescape_uri $token $arg_token;   #存储Cookie的键名的参数
            set $union_token_name "wechaid_$token";
    
            set $union_cookie "";
            if ($http_cookie ~* "$union_token_name=(.+?)(?=;|$)") {
                set $union_cookie $1;
            }
            ...
    }

问题

if 正则表达式中使用 $union_token_name 变量的匹配测试不生效,我试着把 $union_token_name 变量内容替换成字符串却可以获取到 Cookie 的值。

本作品采用《CC 协议》,转载必须注明作者和本文链接
Rubto
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 1

可以尝试map 语法

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
php开发工程师 @ 谷武(北京)科技有限公司
文章
1
粉丝
0
喜欢
0
收藏
0
排名:2663
访问:378
私信
所有博文
博客标签
社区赞助商