2010年6月26日土曜日

短縮URLぽいことをしてみる

ヒマだし面白そうだから、短縮URLっぽいことをするスクリプト書いてみた。
準備するもの
  • .htaccessを置けて mod_rewrite が使えるサーバー
  • CGIが利用可能&Rubyが使える
  • ドメインかサブドメインでのホスティング


public_html 直下に置く .htaccess を作成

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}/REDIRECT_DATA%{REQUEST_URI} -f
RewriteRule ^(.+)$ /redirect.cgi%{REQUEST_URI} [L]
これで、http://www.hoge.com/FooBar にリクエストが来た場合
いままでは /FooBar が存在しない場合は404 Not Foundだったのが

/REDIRECT_DATA/FooBar が存在するなら、404ではなく
リダイレクト用のCGIスクリプト(/redirect.cgi)が呼ばれるようになる。

/REDIRECT_DATA/FooBar が見つからなければ、今まで通り404 Not Found

リダイレクト用のCGIスクリプト redirect.cgi を設置

#!/usr/bin/ruby

begin
file = "REDIRECT_DATA#{ENV['PATH_INFO']}"
raise File.dirname(file) unless %r{^REDIRECT_DATA/} =~ (File.dirname(file)+'/')

File.open(file) do |f|
location = f.gets.chomp
if %r{^/} =~ location
server_name = ENV['SERVER_NAME'] or raise
server_port = ENV['SERVER_PORT'].to_i or raise

if ENV.has_key?('HTTPS') and /off/i !~ ENV['HTTPS']
port = (server_port == 443) ? '' : ':' + server_port.to_s
location = "https://#{server_name}#{port}#{location}/"
else
port = (server_port == 80) ? '' : ':' + server_port.to_s
location = "http://#{server_name}#{port}#{location}/"
end
end

puts "Status: 302 Found"
puts "Content-Type: text/plain; charset=UTF-8"
puts "Location: #{location}"
puts ""
puts location
end
rescue
puts "Status: 500 Internal Server Error"
puts "Content-Type: text/plain; charset=UTF-8"
puts "Cache-Control: no-cache"
puts ""
puts "Internal Server Error"
end
これで準備OK

短縮URLとリダイレクト先の設定

http://www.hoge.com/Foo/Bar へのアクセスを
http://www.hoge.com/abcd/1234/hoge.html に飛ばしたいなら
/REDIRECT_DATA/Foo/Bar というファイルを作成して
http://www.hoge.com/abcd/1234/hoge.html
リダイレクト先のURLを書いておけばOK。
リダイレクト先が同じドメインなら、http://www.hoge.com は省略可
/abcd/1234/hoge.html
↑これでもOK

0 件のコメント:

コメントを投稿