27日の続き。
アクセスに応じてサーバー内のyyyymmdd_n.txtというファイルからyyyymmdd_n.htmlというHTMLを動的に生成して出力することの欠点の一つに「ファイル名から内容を推測できなくなる」というのがあるけど、ローカルで作り手の立場としての解決策を思いついた。原稿ファイル名をURLの拡張子を除いた部分と全く同一にしておく必要はないので、例えばyyyymmdd_n[文書のタイトル].txtなどのように[]内にタイトルを書いておいて、URLとして扱うときにはそれを除いてやればいい。この方法だとカッコをファイル名中のどの位置に付けることもでき、それによってファイル名でのソート順を操作することもできるし、実装も簡単にできる。さらに、半角のカッコを区切り記号として使うことにより、マルチバイト文字が含まれるファイル名がサーバー側で文字化けしても正しい動作が見込める可能性が高くなると思うので、ファイル名にマルチバイト文字を使うことができるし。
また、文書の量が増えてきたら適当なディレクトリ(yyyymmなど)を作って原稿ファイルを分類して保存することになるのだけど、インデックス用のページなど更新頻度が高い文書については原稿データ用のルートディレクトリに置いておくと更新に便利そう。原稿ファイルはデータ用ディレクトリ以下から再帰的に検索されてURLには全く影響を与えないようにしてあるので。
ということで早速実装した。
友人に貸しているURLでもWeb Document SystemとWeb Diary System(いずれも造語)を使えるようにしてみた。
単にCGI用のファイルを設置するのではなく、URL Rewritingを用いてスマートに実現。スクリプト本体はユーザーからは見えない場所に置き、ユーザーは各自の公開用のディレクトリ中にdiaryというディレクトリを作って、そのディレクトリ以下にyyyymmdd.txtという原稿ファイルを置いておけば自動的に日記のページができる仕組み。各種設定は/diary/conf.cgiというファイルを編集して行う。一応設定用のファイルをユーザー用ディレクトリに用意してユーザー自身が設定できるようにしたけれど、このファイルもユーザーから隠蔽することもできるので、単に/diary/というディレクトリ以下に原稿のテキストファイルを置けば全自動で日記のページが生成されるという(ユーザーから見れば)魔法のような使い方もできる。見栄えは外部スタイルシート(/diary/style.css)でカスタマイズ可能。
でも、そのサービスを利用せずに同じURLで日記を書きたいこともあるだろうし、その場合は設定用ファイルを特殊な名前(/diary/conf.cgiなど)にしておいて、そのファイルの有無によってサービスを利用するのかを判断できそう。しかもファイル有無の判断はmod_rewriteの機能で実現できると思うので、CGIスクリプト側に手を加える必要はなく実装もスマートにできそうだし。