mod_rewriteとCGIでServer Side Includesする
mod_rewriteとCGIが使えるけどSSIが(たぶん)使えないサーバーで作業しててふと思いついた
こんなのやりたがる人いるかは怪しいし、くだらないかなと思いつつも書いておく
やったことは単純
.htaccessに、名前が.shtmlで終わるファイルへのアクセスがあった時に、ファイルパスをパラメータにしてCGIを呼び出すように設定する
CGIでSSIの処理を行う
以上
以下に自分が試してみた.htaccessとプログラムを載せる
このプログラムは非常に雑なので、.shtmlファイルに書いてあることならどんなコマンドもexecするし、どのファイルもincludeする
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で書いてること多いな