在 nginx 日志中使用 auth_request 返回的标头 - $sent_http_* 停止工作

在 nginx 日志中使用 auth_request 返回的标头 - $sent_http_* 停止工作

ngx_http_auth_request_module我们在我们的网络应用程序中使用它进行身份验证。

身份验证端点返回一些标头,其中一个标头附加到传出请求。其他标头用于将元数据添加到 nginx 日志(例如谁发出了请求等等)。

日志格式大致如下:

    log_format  main  '[$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" ; sent_http_x_my_type: $sent_http_x_my_email';

基本上sent_http_x_my_type: $sent_http_x_my_email会将 auth_request 端点返回的用户电子邮件附加到访问日志。一切正常(我们运行的是旧版本的 ingress-nginx,它使用 nginx 版本1.20.1)。

自从升级到较新版本的 ingress-nginx 后,我们现在运行的是 nginx 版本1.21.6

由于某种原因,$sent_http 标头不再自动设置。让它们工作并出现在日志中的唯一方法是将其添加到位置定义中

auth_request_set $authHeader1 $sent_http_x_my_email; 就好像你必须访问这个变量才能解析。

以下是重现该问题的 nginx.conf 示例:

#pcre_jit on;
worker_processes  auto;

#error_log  logs/access.log notice;
error_log /var/log/nginx/access.log;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    underscores_in_headers          on;

    log_format  main  '[$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" ; sent_http_x_my_type: $sent_http_x_my_email';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;

    keepalive_timeout  65;

    server {
        listen 8888;

        location /auth {
            access_log off;
            add_header x-my-session 'x-my-session-set';
            add_header x-my-email '[email protected]';
            add_header x-my-type 'internal';

            return 200;
        }
    }

    server {
        listen 8889;

        location /test {
            access_log off;
            return 200 "valid";
        }
    }

    server {
        location /test {
            auth_request        /auth;
            auth_request_set $authHeader0 $upstream_http_x_my_session;
            #auth_request_set $authHeader1 $sent_http_x_my_email; # <-- The value appears in the log only if this is uncommented.
            proxy_set_header 'x-my-session' $authHeader0;

            proxy_pass http://127.0.0.1:8889;
            proxy_redirect                          off;
        }

        location = /auth {
            internal;

            access_log off;

            proxy_pass              http://127.0.0.1:8888;
            proxy_pass_request_body off;
            proxy_set_header        Content-Length "";
            proxy_set_header        X-Original-URI $request_uri;
        }

    }
}

知道为什么它会这样工作吗?我可以打开一些标志来加载 $sent_http 变量吗?

谢谢!

相关内容