lighttpdで携帯端末以外からのアクセスを遮断するために、IPで弾く設定を書こうとしてはまってた。
携帯サイト用にアクセスを許可するIPなどはここらを参考に。
携帯サイトのアクセス制限に必要な公開IPアドレス一覧 | スマホサイト・アプリをつくろう。
lighttpdだと$HTTP["remoteip"]でアクセスを許可するかどうか設定する。設定は、
$HTTP["remoteip"] != "192.168.0.1" { # 192.168.0.1以外からはアクセスを禁止 url.access-deny = ( "" ) }
のように書けるのだが、このvalue部分である"192.168.0.1"の書式がちょっとやっかい。
演算子が==か!=の場合は"192.168.0.0/28"のような指定ができるが、"192.168.0.0/28|123.234.123.0/28"のように複数のアドレス域を指定できない。
=~や!~の正規表現だと最初の"192.168.0.0/28"のようなCIDRを指定できない。IPの数からして正規表現はつらい。
また、lighttpdのconfの変数は、
var.foo = "bar"
というように代入できるけど、
var.foo == "bar" { # ... }
のように比較を行うことができないとか。これは使えない・・・。
なのでひどい、とは思いつつ次のように書いてみる。
$HTTP["remoteip"] != "192.168.0.1" { $HTTP["remoteip"] != "192.168.0.2" { $HTTP["remoteip"] != "192.168.0.3" { # 以下略 } } }
しかしこれだと、ネストが深すぎるのかエラーがでる。1つの設定ファイル内では30回までしかネストできないらしい。
30回ネストしたところでincludeにして別ファイルで続きを書くと動いた。
もちろんこのひどい設定ファイルは、いちいちコピペして書くのは大変なのでPythonスクリプトで生成している。
ほかに綺麗な書き方がありそうな気がする。lighttpdに詳しい人、教えて下さい・・・