Logging header values from the first upstream

Matt Spitz lists at ruby-forum.com
Thu Oct 10 22:27:34 UTC 2013

The HttpUpstreamModule states that variable values for
$upstream_http_$HEADER are only valid for the last upstream accessed
during a request.  I'd like to know if there's a workaround.

Specifically, I'm setting (and then clearing) headers in my first
upstream to get request-specific information like 'username'.  Here's
what I've got:


http {
    log_format myapp '$remote_addr [$time_local] '
                       '$request_time '
                       '"$request" $status '
                       '$request_length $body_bytes_sent '
                       '"$upstream_addr" $upstream_response_time'
                       '$upstream_http_x_myapp_username ';

    server {
        location /api/ {
            access_log /var/log/nginx/myapp_access.log myapp;

            proxy_pass http://myapp_upstream;

            more_clear_headers 'X-MyApp-Username';

        location ~* /internal/media_url/(.*) {
            # only allowed for internal redirects (X-Accel-Redirect,

            # still need to set our access log to get the original
            access_log /var/log/nginx/myapp_access.log myapp;

            proxy_pass $1;


Some of my /api accesses result in internal media redirects, so I use
the X-Accel-Redirect header to redirect to an internal location.
Obviously, when the first location redirects to /internal/media_url/*,
the reference to $upstream_http_x_myapp_username in my log line refers
to the X-MyApp-Username header that is returned by the media server,
which is empty.

How can I log the username with my requests that result in an internal
redirect when the information is only available from the first upstream?

Thanks for your help!

Posted via http://www.ruby-forum.com/.

More information about the nginx mailing list