CGI,FCGIの中の変数を、apacheのLOGに安全に出す方法
皆さん本当にありがとうございます。
@toku_bass++, @xtetsuji++, @kazeburo++
やりたいこと
・ mod_fastcgiな環境で動いているperlスクリプト内の変数を、apacheのLOGに安全に出力したい。
--> 『LogFormat "・・・%{HOGE}n"』のようにフォーマットを定義して、LOG出力したい。
まぁ要は、phpのapache_note関数みたいなことをperlのFCGIでやりたかったわけです。
PHP: apache_note - Manual
mod_copy_headerを使おう
mod_copy_headerを使えばやろうとしていたことがかなってしまいます。
@kazeburoさんが書いてくれました。ありがとうございます!
kazeburo/mod_copy_header · GitHub
インストール
これだけ。簡単。
git clone http://github.com/kazeburo/mod_copy_header cd mod_copy_header/ apxs -c -i mod_copy_header.c
mod_copy_header使用例
ユーザのIDをリクエスト毎にLOGに記録したい場合の使用例です。
CGIサンプル
まぁ適当にこんな感じで。FCGIでやりたいって書いてるのにCGIなのかよといった類のツッコミは棄却します。
#!/usr/bin/perl use strict; use warnings; use CGI; my $user_id = 12345; my $q = CGI->new; print $q->header( -type => 'text/html', -charset => 'utf-8', -'X-UID' => $user_id, ); print $q->start_html(-title=>'test mod_copy_header'), 'mod_copy_headerのテスト', $q->end_html;
httpd.conf設定例
デフォルトのcombinedなLOGに追記するのであればこんな感じ。
LoadModule copyheader_module modules/mod_copy_header.so <IfModule copyheader_module> CopyHeaderActive On CopyHeader X-UID </IfModule> Header unset X-UID LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{X-UID}n" combined CustomLog logs/access_log combined
出力サンプル
こんな感じでLOGが出るようになります。末尾にUIDが出ていますね。
xxx.xxx.xxx.xxx - - [06/Aug/2012:07:56:00 +0000] "GET /test.cgi HTTP/1.0" 200 370 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.57 Safari/537.1" 12345
ポイント
レスポンスヘッダはユーザに丸見えになってしまうので本来重要な情報を含めるべきではありません。
mod_copy_headerで任意のレスポンスヘッダをNotesにコピーし、Notesの内容をLOGに書き込み、コピー元のヘッダをmod_headersで消しているので、大変安全にスクリプトの変数をLOGに渡すことが出来て素晴らしいですね。
細かいことなどはこちらへどうぞ
モジュールの動作についてや、LOG出力の挙動については、@xtetsujiさんと @kazeburoさんの記事で詳しく解説していただいております。
勉強させていただきました。ありがとうございます。
Apache上のPerl FastCGIはCustomLogにデータを書くことができるか?ついでにmod_perlでのお話 | #interest_ae
mod_copy_header ってのを書いた話 Re: Apache上のPerl FastCGIはCustomLogにデータを書くことができるか? - blog.nomadscafe.jp