Perlと.htaccessでFormから検索した結果を.htmlの静的ページにする

検索結果を.cgiや.phpという拡張子ではなく、.htmlに飛ばして表示したかった。PHPだとそういった機能があるようだけど、Perlはないようなので、.htaccessとLocationで行う。そのメモ。


■概要
index.htmlで「foo」を検索すると
./db/foo.html
というファイルが表示される。
実際は「db」というフォルダはないが、.htaccessであるように偽装する


■ファイル説明
.htaccess / 動的ファイルを静的ファイルに偽装する
index.html / トップページ。Fromのactionはsearch.cgi
search.cgi / 変数を静的ファイル名として飛ばす
db.cgi / 検索結果を表示するプログラム


■方法

.htaccess

RewriteEngine on
RewriteOptions MaxRedirects=1
# サブドメインで使用する場合はチェックを外す
# RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# ./db/foo.htmlを開けと要求があったらdb.cgi?q=fooを実行する
RewriteRule ^db/(.*)\.html$ db.cgi?q=$0 [L]

index.html

<html>
<body>
<form action="search.cgi">

</form>
</body>
</html>

search.cgi

#!/usr/bin/perl
use strict;
use CGI;
my $q = CGI->new();
my $TARGET = $q->param('q');
print "Location:db/$TARGET\.html\n\n";

db.cgi

普通に検索プログラム

ここで問題が。db.cgi?q=fooで要求がくるはずだが、my $q = CGI->new();などを使って変数を取得しようとすると、日本語が文字化けする。utf8で送っているんだけど、なんでだろう?なので$ENV{'REQUEST_URI'}などから無理やり変数を取得した。


■動作サンプル
サイトを探す http://word.xrea.jp/
ここで何かを検索すると静的ファイルに飛ぶと思う。リフレッシュで飛ばしているわけじゃないので、ブラウザのバックボタンで戻っても問題ない。

こんな感じでおk

 


TrackBack(0)

TrackBack URL for this entry:
http://www.qunea.com/mt/mt-tb.cgi/1737

Post a comment











画像の中に見える文字を入力してください。