Snap.Shot.cx

トップページへ戻る

[サーバ] URL短縮はmod_rewriteで
01/11/2010 14:27 (投稿者:たかの)

遅くなりましたが新年おめでとうございます。今年こそ良い年にしたいものです。
さて、たぶんWeb2.0なんて言葉が流行りだしたあたりだと思うのですが、嬉々として使う人たちの気持ちが理解できないようなネットサービスが目立つようになりました。しかし各々について批判を繰り広げるのは野暮だし、わざわざ書くほど時間的にも精神的にも余裕がありませんでした。(ついスカイプについては書いたけど(汗))
最近になって、ようやく精神面で少し余裕が出てきて、持ちネタを少し披露してみたくなりました。
というわけで、第一弾として表題の件について書きます。具体的な方法は本文に。

まず前提条件としては、

・mod_rewriteを有効にしたApacheであること

mod_rewriteモジュールが追加されたのは、たしか1.3系の中頃あたりだったと思うので、現行稼働中のほぼ全てのApacheで利用可能と思われます。
ただ管理者設定でモジュール自体を無効にされているとダメですね。
また、使用するディレクティブのうち "RewriteMap" はserver config(S)もしくはvirtual host(V)に記述する必要がありますので(おそらくmap nameがシステムグローバルなため)、.htaccessしか触れない人にはこの手法は使えません。

AllowOverride FileInfo

で委譲してもらうことで、RewriteCond,RewriteRuleをdirectory(D)ないし.htaccess(H)に書くことはできます。
ただしS/Vに記述する場合とD/Hに記述する場合では、記述方法に若干の違いがあります。

では具体例です。まずは以下のように記述したテキストファイルを作成してください。

----

YT http://snap.shot.cx/ZWiki/YukimasaTakano

----

スペースで区切った前半は短縮名、後半は実際のURLです。
これを適当なファイル名でサーバ上の適当な場所に保存します。

つづいてApacheのS or VブロックにRewriteMapの記述を加えます。
さきに保存したファイルを参照するよう、以下のように記述してください。

RewriteMap snapshot_shorturl txt:/home/httpd/redirect-data/url.txt

そして最後にRewriteRuleの記述を追加します。
以下はDHブロック(.htaccessなど)に記述する例なので、SVブロックに記述する場合は適宜読み替えてください。

----

RewriteEngine on

RewriteRule ^(.*) - [E=rewrite-dest:${snapshot_shorturl:$1}]

RewriteCond %{ENV:rewrite-dest} !^$
RewriteRule ^(.*) %{ENV:rewrite-dest} [NE,R=permanent]

----

上の例は、マップの記述が存在しない場合は素通し(サーバ上に実在するファイルを参照)することになります。
またリダイレクトは301(permanent)で行われます。
mod_rewriteのモジュールリファレンスを参考にして、用途に応じて適宜変更してください。

実際に設置した例も置いておきますので、どうぞ試してみてください。

http://snap.shot.cx/goto/YT
http://snap.shot.cx/goto/GG
http://snap.shot.cx/goto/url.txt

登録件数が増えてくる(数千件以上)と、plain textではパフォーマンスに難が出てくるかもしれません。
その際はhttxt2dbmなどを使って、dbm形式のマッピングファイルを作成することで軽減できるでしょう。



※2/21追記: エスケープされたURLをテキストに記述した場合「%」が多重エスケープするのを回避するために[NE](noescape)フラグの指定が必要だったのですが、.htaccessの記述例から抜けていましたので本文を修正しました。

メールでコメント

(Powered by Zope)
リンクはご自由にどうぞ。各記事には記事番号がついていますので、URLは変わりません。
© 2000-2013 Yukimasa TAKANO, all RIGHTs reserved.