リバースプロキシしてるのに何故リモートホストが取れるのか

普通リバースプロキシすると、リモートホスト127.0.0.1とかになる。
リモートホストはX-Forwarded-Forに入るのに。
でもCatalystの$c->req->addressはちゃんとリモートホストを返してくれる。
何故か。はい神が解説してくれました。

/usr/lib/perl5/site_perl/5.8.8/Catalyst/Engine/Apache.pm

    {
        my $headers = $self->apache->headers_in;
        unless ( $c->config->{using_frontend_proxy} ) {
            last PROXY_CHECK if $c->request->address ne '127.0.0.1';
            last PROXY_CHECK if $c->config->{ignore_frontend_proxy};
        }
        last PROXY_CHECK unless $headers->{'X-Forwarded-For'};

        # If we are running as a backend server, the user will always appear
        # as 127.0.0.1. Select the most recent upstream IP (last in the list)
        my ($ip) = $headers->{'X-Forwarded-For'} =~ /([^,\s]+)$/;
        $c->request->address( $ip );
    }


とまあこんな感じで。前後に色々あるけど華麗にスルー。
X-Forwarded-Forヘッダがあって、それがリモートホストっぽかったら$c->req->addressにぶちこんでる。
複数のサーバをプロキシされると、X-Forwarded-Forはカンマ区切りで全てのサーバのIPを持つけど、
その中の最後の一つだけをぶち込んでる。
コメントにあるとおり、フロント・バックエンドで動くことを想定してる。


いやー神凄い。Catalystのコード8割読んでるのは伊達じゃねえっす。