lighttpd だけで多言語サイトを作る方法

lighttpd 1.4.21 以上では $HTTP["language"] という新しい変数(?)が設定の中で使えるようになり、これを使用するとクライアントの Accept-Language に応じて lighttpd の設定を変えることが可能になります。

これを利用して多言語化しているサイトとしては opensource.kayac.com が有名です。

このサイトは以下のような設定で動作しております。

$HTTP["url"] !~ "^/(?:(?:css|js|img|images?|static|tmp)/|[^/]+\.[^/]+$)" {
    $HTTP["url"] !~ "^/(en|ja)(?:$|/)" {
        $HTTP["language"] =~ "(en|ja)" {
            url.redirect = ( "^/(.*)" => "/%1/$1" )
        }
        $HTTP["language"] !~ "(en|ja)" {
            url.redirect = ( "^/(.*)" => "/en/$1" )
        }
    }
}

ちょっとややこしいですが、

$HTTP["url"] !~ "^/(?:(?:css|js|img|images?|static|tmp)/|[^/]+\.[^/]+$)" {

で、cssやjsディレクトリ、もしくはルート直下のファイルへのアクセスはそのまま。

$HTTP["url"] !~ "^/(en|ja)(?:$|/)" {

で、すでに /ja//en/ へのリクエストであればそのまま。

上記に該当しなかった場合、

$HTTP["language"] =~ "(en|ja)" {
    url.redirect = ( "^/(.*)" => "/%1/$1" )
}

で、Accept-Context が en か ja の場合はそれに応じてリダイレクト先を振り分ける。それ以外の時(対応していない言語の場合)は

$HTTP["language"] !~ "(en|ja)" {
    url.redirect = ( "^/(.*)" => "/en/$1" )
}

で、デフォルトの言語(ここではen)にリダイレクトする。

というような感じで動作しております。

このような使い方以外にもさまざまな使い方ができそうですね。覚えておくともしかしたら使えるかもしれません。