まず前提条件としては、
・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の記述例から抜けていましたので本文を修正しました。
|