Sis puella magica!

いろいろ書く予定

mod_rewriteとCGIでServer Side Includesする

mod_rewriteCGIが使えるけどSSIが(たぶん)使えないサーバーで作業しててふと思いついた
こんなのやりたがる人いるかは怪しいし、くだらないかなと思いつつも書いておく

やったことは単純

.htaccessに、名前が.shtmlで終わるファイルへのアクセスがあった時に、ファイルパスをパラメータにしてCGIを呼び出すように設定する
CGIでSSIの処理を行う
以上

以下に自分が試してみた.htaccessとプログラムを載せる
このプログラムは非常に雑なので、.shtmlファイルに書いてあることならどんなコマンドもexecするし、どのファイルもincludeする

.htaccess

RewriteEngine on
RewriteRule ^(.*\.shtml)$ ssi.cgi?path=$1 [L]

ssi.cgi

#!/usr/bin/ruby

require 'cgi'

def handle_ssi(direc, param, value)
  case direc
    when 'include'
      if param == 'file'
        #valueのチェックをしていない
        open(value){|f|
          f.read
        }
      else
        raise NotImplementedError
      end
    when 'exec'
      if param == 'cmd'
        #任意のコマンドを実行
        IO.popen(value){|io|
          io.read
        }
      else
        raise NotImplementedError
      end
    else
      raise NotImplementedError
  end
end


cgi = CGI.new
path = cgi['path']
begin
  #pathのチェックをしていない
  file = open(path)
  output = file.read.gsub(/<!--#(.*?) (.*?)="(.*?)"-->/){|matched|
    handle_ssi($1, $2, $3)
  }
rescue => e
  print "Status: 404 Not Found\n"
  print "Content-Type:text/plain\n\n"
  p e
  exit
ensure
  file.close
end

print "Content-Type:text/html\n\n"
print output

最近はrubyで書いてること多いな