nginx 中的自定义标头:先记录,后清理

Val*_*hek 4 nginx log-files http-headers

我需要解析 nginxaccess_log并将记录与用户帐户关联起来。为此,我决定使用自定义标头:

  1. 应用程序发送自定义标头(如x-userid
  2. Nginx 使用自定义日志格式将该值存储在 access_log 中$sent_http_x_userid
  3. 标头正在被清除,因此客户端看不到它more_clear_headers 'x-userid'

日志记录工作正常,我可以在 access_log 中看到正确的用户 ID。但是,如果我打开清除部分,access_log 将显示“-”而不是实际的用户 ID。

难道我做错了什么?是否可以在将其发送到客户端之前从应用程序记录标头,然后使用 nginx 将其清空?

有没有更好的方法来完成这项工作?该应用程序是PHP7,nginx是1.10.3

Ale*_*Ten 6

由于$sent_http_x_userid变量名称字面意思是标头已发送到客户端。当你清理它时,nginx不会发送它并且不会有变量$sent_http_x_userid

但您实际需要的是记录从上游收到的标头。为此有$upstream_http_x_userid您可以写入日志变量。

如果您不想将此标头传递给客户端,则可以proxy_hide_header指令。

所以所有的一起看起来就像这样

log_format coolname '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent [uid=$upstream_http_x_userid] '
                    '"$http_referer" "$http_user_agent"';

server {
    ...
    access_log /var/log/nginx/cool.log coolname;

    location /whatever {
        proxy_pass http://your-app;
        proxy_hide_header x-userid;
    }
}

Run Code Online (Sandbox Code Playgroud)