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 变量吗?
谢谢!