差分表示


カモランドではリダイレクト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)にリライトする.

&ltitle(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で,最終的な目的ページへのリダイレクトを行う.

&ltitle(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は,以下のような内容だ.

&ltitle(/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リダイレクトに変更しました.

&ltitle(view.cgi);
--(
[変更前]
print "Location: $new_url\n\n";
-----------------------
[変更後]
print "Status: 301 Moved Permanently\n";  # ←追加
print "Location: $new_url\n\n";
--)
*メンテナンス
リダイレクトしたいページを追加するときは,alias.txtに行を追加すれば良い.
簡単だ.


© 2023 KMIソフトウェア