技術史

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に設定して、自分でファイルを開いて置換して

出力する為PHPCGIの処理後に置換処理を挟むことが出来ないようです。

http://search.cpan.org/~geoff/Apache-SimpleReplace/

自作したモジュールは以下です。

Apache/StrReplace.pm

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