差分表示
- 最後の更新で追加された行はこのように表示します。
- 最後の更新で削除された行は
このように表示します。
カモランドではリダイレクトCGIを使って短縮URLを実装しています
//parent=Apache
*はじめに
カモランドの短縮URLは,例えば以下のような動きをします.
+&verb(http://)kamoland.com/alias/''pyukiwiki-cache.html'' をブラウザで開くと,
+&verb(http://)kamoland.com/wiki/wiki.cgi?PyukiWiki%a4%cb%a5%ad%a5%e3%a5%c3〜 が開く
これは 2.のページに対して,「''pyukiwiki-cache.html''」
という短縮URLを与えているという状況なのですが,
実際にカモランドでこれを実現している方法について,説明します.
-Apache 2.2.4
*短縮URLの実現方法
以下の2段構えで行っています.
+Apacheで,短縮URL(html)をcgiへのリクエストにリライトする
+cgiで短縮URLに対応する完全URLを検索し,そのURLへのリダイレクト応答を返す
**1.Apacheの設定
短縮URLは普通のHTMLのURLに見せかけているので,
どうしてもApacheの助けが必要.
Apacheのmod_rewriteを設定して,/alias/〜へのリクエストをリダイレクト用CGI(view.cgi)にリライトする.
<itle(httpd.confより抜粋);
--(
RewriteEngine on
RewriteRule ^/alias/(.*) /wiki/view.cgi?$1 [PT]
--)
**2.リダイレクトCGI
上述のApacheの設定で,
http://kamoland.com/alias/pyukiwiki-cache.html
へのリクエストが,
http://kamoland.com/wiki/view.cgi?pyukiwiki-cache.html
へのリクエストにリライトされるようになった.
そこでこのview.cgiで,最終的な目的ページへのリダイレクトを行う.
<itle(view.cgi);
--(
#!/usr/bin/perl
use strict;
my $dbfile = '/var/www/alias.txt';
my $query = $ENV{'QUERY_STRING'};
my $url = $query;
$url =~ s/\///g;
my $new_url = `grep $url $dbfile`;
$new_url = (split(/ /, $new_url))[1];
print "Location: $new_url\n\n";
--)
凶悪なことに内部でOSのgrepコマンドを呼び出しているので,
LinuxなどUnix系でないと動かないと思います.
とは言え,grepでやってることは単純なので,grepを呼び出している箇所は簡単にperlに書き直せると思います.
$dbfileという名前のファイルをオープンして,$urlを含む行を検索すれば良いだけです.
$urlはview.cgiに渡されたパラメータ(=短縮URL.例えばpyukiwiki-cache.html)ですが,
それに対応する完全なURLを$dbfile(=alias.txt)から探し,
その完全URLへのLocationヘッダを最後に出力して終わりです.
CGIでこのようにLocationヘッダを出力すれば,
HTTPのステータスコードはApacheが良きに計らってくれる.
実際には以下のようなレスポンスが得られた.
--(
HTTP/1.0 302 Found
Date: Fri, 18 May 2007 14:35:08 GMT
Server: Apache
Location: http://kamoland.com/wiki/wiki.cgi?PyukiWiki%a4%cb%a5%ad%a5%e3%a5%c3%a5%b7%a5%e5%b5%a1%c7%bd%a4%f2%a4%c4%a4%b1%a4%eb
Content-Length: 299
Connection: close
Content-Type: text/html; charset=iso-8859-1
--)
ステータスは「302 Found」ですな.(俺はてっきり302は,Moved Temporarilyだと思っていた...)
短縮URLと完全URLの対応付けを保持しているalias.txtは,以下のような内容だ.
<itle(/var/www/alias.txtより抜粋);
--(
pyukiwiki-cache.html http://kamoland.com/wiki/wiki.cgi?PyukiWiki%a4%cb%a5%ad%a5%e3%a5%c3%a5%b7%a5%e5%b5%a1%c7%bd%a4%f2%a4%c4%a4%b1%a4%eb
url_alias-impl.html http://kamoland.com/wiki/wiki.cgi?%c3%bb%bd%ccURL%a4%ce%bc%c2%c1%f5
--)
***301リダイレクトへの変更 (2009.03.01)
*メンテナンス
リダイレクトしたいページを追加するときは,alias.txtに行を追加すれば良い.
簡単だ.
*301リダイレクトへの変更 (2009.03.01)
その後,[[対GoogleBotで問題があった>GoogleBotに302リダイレクトは禁物]]ので,以下のように302から301リダイレクトに変更しました.
<itle(view.cgi);
--(
[変更前]
print "Location: $new_url\n\n";
-----------------------
[変更後]
print "Status: 301 Moved Permanently\n"; # ←追加
print "Location: $new_url\n\n";
--)
*メンテナンス
リダイレクトしたいページを追加するときは,alias.txtに行を追加すれば良い.
簡単だ.