2007-07-10 運用サーバーと開発サーバーを分けて開発する
運用サーバーと開発サーバーを個別に構築し、開発サーバーでテストを行う場合、
大抵hostsファイルや社内DNSで一時的にIPを開発サーバーに向けていましたが、
www.example.com ... xxx.xxx.xxx.xxx (運用時)
www.example.com ... yyy.yyy.yyy.yyy (開発時)
しかしこれではどっちのサーバーを見ているのか解りづらい為、
www.example.com ... xxx.xxx.xxx.xxx (運用時)
dev.example.com ... yyy.yyy.yyy.yyy (開発時)
という用にドメインを分けることにしました。
しかし、httpのページからhttpsのページへ遷移する際等、
https://www.example.com/foo.htmlというリンクを張る為、
不意に開発サーバーから運用サーバーに切り替わってしまい事があります。
www.example.com を dev.example.com に置換して出力すれば良い訳ですが、
今回はその方法にApacheのPerlOutputFilterHandlerを使うことにしました。
Apache::SimpleReplaceという要求に近いモジュールはありますが、
これはPerlHandlerに設定して、自分でファイルを開いて置換して
出力する為PHPやCGIの処理後に置換処理を挟むことが出来ないようです。
http://search.cpan.org/~geoff/Apache-SimpleReplace/
package Apache::StrReplace; BEGIN { if ( $ENV{'MOD_PERL_API_VERSION'} == 2 ) { require Apache2::Filter; push @ISA, 'Apache2::Filter'; require Apache2::Response; require Apache2::Const; require Apache2::RequestRec; require Apache2::RequestUtil; Apache2::Const->import(qw(OK DECLINED)); } else { require Apache::Filter; push @ISA, 'Apache::Filter'; require Apache::Response; require Apache::Const; require Apache::RequestRec; require Apache::RequestUtil; Apache::Const->import(qw(OK DECLINED)); } } use strict; use warnings; use constant BUFF_LEN => 1024; sub handler { my $f = shift; unless ($f->r->content_type =~/text\/html/) { return DECLINED(); } unless ( $f->ctx ) { $f->ctx( { body => '' } ); } while ($f->read(my $buffer, BUFF_LEN)) { $f->ctx->{'body'}.= $buffer; } unless ($f->seen_eos) { return OK(); } my $search = $f->r->dir_config('StrReplaceSearch'); my $replace = $f->r->dir_config('StrReplaceReplace'); $f->ctx->{'body'}=~s/$search/$replace/ig; $f->r->set_content_length( length( $f->ctx->{'body'} ) ); $f->print( $f->ctx->{'body'} ); OK(); } 1;
StrReplaceSearch を StrReplaceReplace に置換します。
httpd.conf
PerlModule Apache::StrReplace PerlSetVar StrReplaceSearch www.example.com PerlSetVar StrReplaceReplace dev.example.com PerlOutputFilterHandler Apache::StrReplace
コメントを書く
トラックバック - http://d.hatena.ne.jp/askadna/20070710