http://d.hatena.ne.jp/end0tknr/20140209/1391929480
以前のエントリの続き、↓こちらのurlが参考になりました。
http://notebook99.blog87.fc2.com/blog-entry-64.html
実現したい構成
以下の様な構成で、リバースプロキシ側で認証されたユーザID ( $ENV{REMOTE_USER} )を裏側?のアプリケーションサーバに渡すことが目的です。
※通常、revserse proxy と app servserは、別のプロセスで動作しているので、$ENV{REMOTE_USER} のような環境変数は渡すことができません
┌RV PROXY────┐ ┌ APP SERVER ──┐ │※AuthType BASIC├>(REMOTE USER)->│※AuthType NONE │ └────────┘ └────────┘
リバースプロキシ側で、mod_rewrite & mod_headers を利用
以下は、リバースプロキシ側のhttpd.conf抜粋です。
mod_rewrite と mod_headers で環境変数:REMOTE_USERを、アプリケーションサーバへのリクエストhttpヘッダ:X-Forwarded-User に追加できます。
<LocationMatch "/xing_g/"> AuthType Basic AuthName member AuthUserFile /home/xing/httpd/.htpasswd require valid-user ErrorDocument 401 /error/authen-error-xing.html </LocationMatch> ProxyRequests Off <Location /xing_g> ProxyPass http://10.209.15.XXX/XingG/ ProxyPassReverse http://10.209.15.XXX/XingG/ RewriteEngine On RewriteCond %{LA-U:REMOTE_USER} (.+) RewriteRule . - [E=RU:%1,NS] RequestHeader add X-Forwarded-User %{RU}e </Location>
アプリケーションサーバ側で、 httpヘッダ:X-Forwarded-User を受信
RewriteEngine On RewriteCond %{REMOTE_USER} $^ RewriteCond %{HTTP:X-Forwarded-User} (.+) [NC] RewriteRule . - [E=REMOTE_USER:%1,NS]
先程の http://notebook99.blog87.fc2.com/blog-entry-64.html によれば、裏側のapacheのhttpd.confで上記のように記載することで、X-Forwarded-User を REMOTE_USER として受信できるようですが...
次のようなエラーとなり、この方法は採用しませんでした。
( Options FollowSymLinks を追加することで解消するという情報もありましたが、私の環境では効果がありませんでした)
Options FollowSymLinks or SymLinksIfOwnerMatch is off which implies that RewriteRule directive is forbidden: ...
アプリケーションサーバ側で、httpヘッダは大文字化等の変換有り
結局、リバースプロキシ側でセットされたHTTPヘッダ: X-Forwarded-User は、バックエンドのapache (mod_perl)で次のような環境変数で受信することにしました。
$ENV{"HTTP_X_FORWARDED_USER"}
perlに限った話かもしれませんが、大文字化、ハイフン(-)はアンダースコア(_)、先頭に「HTTP」の文字列 付加等、ヘッダ名が変更されるようです。