リバースプロキシしてるのに何故リモートホストが取れるのか
普通リバースプロキシすると、リモートホストが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割読んでるのは伊達じゃねえっす。