フタなしカンヅメ

徒然なるままに @happytar0

lighttpdで直リンク対策を簡単にする

前回に引き続き直リンク対策をlighttpdでおこなってみたいと思います。Apacheと同じようにrewriteで・・・と行きたい所ですが、lighttpdmod_rewriteは、Apacheほどの機能は持っていないようです。
設定ファイルにずらずらと書いて行ってもいいのですが、それでは簡単ではありません。色々調べた所、lighttpdでは、include_shellという便利な機能があります。これは、スクリプトなどで出力した結果をそのまま設定として読み取ってくれるという便利な機能です。
今回は、include_shellを使って、ドメイン許可リストから読み取ったものを設定として出力するといったことをしたいと思います。

lighttpdの設定は以下のようになります。

include_shell "/usr/local/etc/lighttpd/referer_list.rb"

referer_list.rbの中身は以下になります。

#!/usr/bin/env ruby

list_file = '/usr/local/etc/referer_list'

referer_list = []
File::open(list_file) do |f|
  while line = f.gets
    referer_list << line.chomp if line.chomp[0, 1] != "#"
  end
end

str = referer_list.join("|").gsub(/\./, "\\.")
puts <<EOS
$HTTP["referer"] !~ "^($|http://(www\\.)?(#{str}))" {
        url.access-deny = (".jpg", ".jpeg", ".gif", ".png", ".bmp", ".swf")
}
EOS

例の如くreferer_list.rbには実行権限が必要です。$HTTP["referer"]を使って、正規表現で許可するドメイン(ホスト)を羅列していくシンプルなものです。後は、条件に一致しないドメインに対し、access-denyをかけます。

referer_list.rbに実行権限をかけるのを忘れ、ひたすら悪戦苦闘してしまった・・・。何もエラーが出ないようなので気をつけてください。