STARTING OVER日記。
« スパムよけ。 |
インデックス
| PukiWikiの今後。 »
2007年10月31日(水)
プチ作業。
数日前より、日記系(=Movable Typeで作成しているコンテンツ)の作業をちょこちょこと。
ダイナミックパブリッシングというヤツを使っていたのですが、28日早朝のサーバメンテナンス以降、DNSが変わった(らしい)せいか、うまくキャッシュを読み込めず。
サーバ容量も増えたことだし(と言っても、1GB→5GBで、現状200MB overの私にはまだまだ余裕ありなのですが)、レスポンスもそれに伴い早くなったらしいし、ということで、ダイナミックパブリッシングは廃止。
元通り、ページを作成させました。
で、それから遡ること数ヶ月。
実は、アー日記とVitzでんは、archivesというフォルダにコンテンツを入れておりました。
例えば、2006.1.1の日記なら、「/archives/2006_01_01.html」みたいな。
その「archives」を取っ払って、.htaccessでリダイレクトをしていたんですね。
Redirect permanent /cgi/diary/archives/ http://www.victory-garden.jp/cgi/diary/
みたいな感じ。
しかし、これをつい先日廃止しまして。
でもまぁ、なんだか「archives」に来た人には不親切?と思ってまして。
だって、エラーメッセージが出るわけで。
本当は移動しただけでファイルはあるのに「ファイルはありません」みたいな。
でもダイナミックパブリッシングの場合、なんだか作業をするのもややこしく。
ところが、それを使わないことにしたら、作業も出来るってぇわけで。
そんなわけで、本日プチ作業。
【目的】
・古いURLに来た人を新しいURLに誘導する仕組みを作る。
・アクセス内容に則した移転メッセージを自動で出力する仕組みを作る。
・ブログの構成を変更した場合の「リダイレクトを使わない」移転先表示を実現する。
【流れ】
1.古いURLにアクセスする。
2.「.htaccess」でメッセージが出るページに自動的に移動させる。
3.メッセージのページに新しいURLを記載してお知らせする。
【そんなわけで、ソース。(簡易版)】
※本当に使っているヤツはもうちょっと複雑。
#!/usr/local/bin/perl
$host = $ENV{'HTTP_HOST'};
$request = $ENV{'REQUEST_URI'};
$protocol = "http://";
$moto = "$protocol$host$request";
$arata = $moto;
$arata =~ s/\/archives//i;
print "Content-type: text/html\n\n";
print <<"EOF";
<html>
<head>
<meta http-equiv="refresh" content="60;URL=$arata">
<title>移動しました。</title>
</head>
<body>
<h1>移動しました。</h1>
<p>このページは移動しました。</p>
<ul>
<li>旧ページ:$moto</li>
<li>新ページ:<a href="$arata">$arata</a></li>
</ul>
<p>誠に勝手ながら、新ページの方をご覧下さい。<br>(60秒後に新ページに自動的に移動します。)</p>
</body>
</html>
EOF
exit;
1行目はお約束。
2、3行目は環境変数の取得。
2行目でホストのホスト名を取得。
うちの場合はwww.victory-garden.comとかalfee.victory-garden.jpとかがあるから、取得が必要だけど、一つしかドメインがない場合は決め打ちでいいかも。
3行目はリクエストされたURIの取得。
「/cgi/diary/archives/2006_01_01.html」とか「/cgi/diary/archives/000001.html」とか。
ホスト名以下の部分。
で、4行目はプロトコル。「http://」で決め打ち。
ちなみにhttpってのはハイパーテキストの送信プロトコルという意味です。
あとは調べて下さい。(笑)
5行目で元のURLを作成します。
プロトコルとホスト名とURIをくっつければ完成。
6行目は5行目の内容の複写。本当は7行目とくっつけて表示できますが。
7行目は、元のURLから「/archives」を抜く作業。
「s///」は置換演算子です。
例えば「$hoge =~ s/A/B/;」だったら、$hogeの中に最初に現れる「A」という文字は「B」に置き換えられます。
$hogeの中の全ての「A」を「B」に置き換えるなら「$hoge =~ s/A/B/g;」というように末尾に修飾子の「g」をつけます。
7行目の末尾につけた修飾子「i」は大文字小文字区別せず、ってヤツですんで、「$hoge =~ s/A/B/i;」なら、大文字のAでも小文字のAでも、最初に出てきたAないしaはBに置き換え。
全部変えるなら「$hoge =~ s/A/B/ig;」です。
修飾子は他にも色々ありますがあとは調べて下さい。(笑)
本題に戻って。
7行目の文では「/archives」を抜いています。検索して、「null」との置き換え、とでも言うべきかな。
しかし、置換演算子の中で「$arata =~ s//archives//i;」とかやっちゃうと確実にエラー。
演算子のスラッシュと置き換える文章のスラッシュの区別がつかないんで。
「スラッシュが多いぜ」と言われます。
で、スラッシュはエスケープして「$arata =~ s/\/archives//i;」です。
あ、「$arata =~ s/archives\///i;」でもOKかと。
8行目もお約束。htmlを吐くなら必要です。
9行目からは面倒くさがりな私向けのprint文。
「EOF」までの部分を出力するぜ、って命令。
10~24行目はhtmlで、25行目がEOF、26行目でプログラムおしまい。
あー、あと、archivesってフォルダを作って(一度消したのに復活させた)、その中に.htaccessを。
ErrorDocument 404 /hoge/ido.cgi
.htaccessはこんな感じ。
archivesフォルダに来たけどファイルがなかったら(=404エラーなら)、全て/hoge/ido.cgiに飛ばすぜ、と。
実際はこんなフォルダに入っていませんが、さっきのcgiは上記の例では「hoge」フォルダにido.cgiという名前を付けて、パーミッションは755。
ま、環境によっては動いたり動かなかったりというのはあるでしょうから、使うのなら全てオウンリスクでよろしくです。(笑)
…今思えば、「60秒」ってのも変数に出来ますわね。
4行目と5行目の間あたりに「$byo = "60";」とかいうのを作って、htmlのあたりで「<meta http-equiv="refresh" content="$byo;URL=$arata">」とかやって、「($byo秒後に新ページに自動的に移動します。)」とかね。