documents:proglang:perl:perl-011
差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン | |||
| documents:proglang:perl:perl-011 [2026/05/08 11:54] – ↷ documents:perl:perl-011 から documents:proglang:perl:perl-011 へページを移動しました。 k896951 | documents:proglang:perl:perl-011 [2026/05/17 15:05] (現在) – [apache+perl+BerkeleyDBで簡易リダイレクト] k896951 | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| + | ====== 100.apache+perl+BerkeleyDBで簡易リダイレクト ====== | ||
| + | 2011/09/04 作成。freestyle wiki から dokuwiki に移行する際にやった事。 | ||
| + | |||
| + | 2013/ | ||
| + | こちらのドキュメントは管理都合によりwww関連ドキュメントのネームスペースから移動しました。 | ||
| + | |||
| + | |||
| + | ===== 概要 ===== | ||
| + | |||
| + | wikiシステムの更新でURLの指定方法がガラリと変わりました。\\ | ||
| + | 旧URLから新URLへのリダイレクトを行うにあたり.htaccessへの ReDirectディレクティブ記述では難しい場合があり、CGIで置き換えする方法をとりました。 | ||
| + | |||
| + | その時の備忘録です。 | ||
| + | |||
| + | ===== URL変換 ===== | ||
| + | |||
| + | |||
| + | 新旧URLは以下のようになります。 | ||
| + | |||
| + | ^ 旧URL | http:// | ||
| + | ^ 新URL | http:// | ||
| + | |||
| + | 旧URLではページ名にはEUC-JPな漢字を使いまくっていたため、見た目にも長くて大変なURLになっていました。 | ||
| + | これを、新URLではページ名にカテゴリ+番号を適用し、URLをすっきりさせます。 | ||
| + | |||
| + | また、旧URLは検索エンジンのインデックスにすでに登録されているし、他の人のサイトで使われていたりします。 | ||
| + | 利便性やケアを考えると、旧URLのアクセスでも新URLへリダイレクトしてあげるほうが混乱も無くよいかと思います。 | ||
| + | |||
| + | リダイレクトする場合、ページ名が同じでベースのURLが異なるだけなら .htaccess の ReDirectディレクティブを記述すればよいのですが、 | ||
| + | 完全に不一致なURL間の変換になるので、.htaccess へフルパスで記述しなければならなくなります。面倒です。 | ||
| + | |||
| + | ===== CGI ===== | ||
| + | |||
| + | 旧URLで使用していたwikiシステムの wiki.cgi を廃止し、新たに新URLへのリダイレクトプログラムとして作成します。 | ||
| + | 具体的には、pageパラメタで指定された旧ページ名を新ページ名に変換し、新URLを生成、このURLへSTATUS 301でリダイレクトさせます。 | ||
| + | |||
| + | <code perl wiki.cgi> | ||
| + | use BerkeleyDB; | ||
| + | |||
| + | my $DB = new BerkeleyDB:: | ||
| + | my $page = $ENV{' | ||
| + | my $newpage | ||
| + | |||
| + | print " | ||
| + | |||
| + | if ( $page eq "" | ||
| + | { | ||
| + | print " | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | $page =~ s/ | ||
| + | |||
| + | if ( $DB-> | ||
| + | { | ||
| + | print " | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | print " | ||
| + | } | ||
| + | } | ||
| + | |||
| + | undef $DB; | ||
| + | |||
| + | </ | ||
| + | |||
| + | バークレイDB / | ||
| + | Keyを旧ページ名として検索を行い、検索できればValueを新ページ名とし新URLに適用、遷移させます。\\ | ||
| + | 検索できなければ、あらかじめ準備したエラー画面へ遷移させます。 | ||
| + | |||
| + | スクリプト中の | ||
| + | print " | ||
| + | |||
| + | は、CGIからHTTPのステータスを制御させるために、Statusヘッダを出力させます。このヘッダで指定されたステータスをapacheがクライアントに返します。 | ||
| + | Statusヘッダ自体はクライアントへ送りません。 | ||
| + | |||
| + | ===== 一覧表の作成 ===== | ||
| + | |||
| + | |||
| + | バークレイDB / | ||
| + | |||
| + | <code perl redirectdb.pl> | ||
| + | use BerkeleyDB; | ||
| + | |||
| + | my $DB = new BerkeleyDB:: | ||
| + | |||
| + | $DB-> | ||
| + | $DB-> | ||
| + | $DB-> | ||
| + | $DB-> | ||
| + | $DB-> | ||
| + | $DB-> | ||
| + | $DB-> | ||
| + | $DB-> | ||
| + | $DB-> | ||
| + | |||
| + | undef $DB; | ||
| + | |||
| + | </ | ||
| + | |||
| + | 旧ページ名「RSS1ウオッチ」はURLエンコードされると「RSS%A3%B1%A5%A6%A5%AA%A5%C3%A5%C1」になります。\\ | ||
| + | これに対応するのが新ページ名「/ | ||
| + | |||
| + | 必要なページの数だけ、エントリを増やしていきます。 | ||
| + | |||
| + | |||
| + | ===== URLエンコードの罠 ===== | ||
| + | |||
| + | |||
| + | URLエンコードは本来一意に決まるはずなのですが、その解釈の仕方でずいぶん流儀があるようです。 | ||
| + | |||
| + | 旧ページ名の「JDK16のコンパイル on FreeBSD/ | ||
| + | ^ 旧ページ名 | ||
| + | | JDK16のコンパイル on FreeBSD/ | ||
| + | | ::: | JDK16%C2%A4%CE%A5%C2%B3%C2%A5%C3%B3%C2%A5%D1%A5%C2%A4%C2%A5%C3%AB%20on%20FreeBSD/ | ||
| + | | ::: | JDK16%A4%CE%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB+on+FreeBSD%2FAMD64+8.0+RELEASE | | ||
| + | |||
| + | スペースは“+”になるはずなんですが、%20で扱っていたり、変な変換がされたコード列が使われていたり.... | ||
| + | こういう場合はエントリを三つ登録しなければいけません。 | ||
| + | |||
| + | {{tag> | ||
documents/proglang/perl/perl-011.txt · 最終更新: by k896951
