mod_cidr_lookupで携帯のキャリア判別設定を統合

エージェント偽装を防ぐため、携帯キャリアの判別にIPアドレスを使っているところは多いと思います。
使うところは基本的に以下の3つではないでしょうか。

携帯キャリアのIPアドレスはけっこう頻繁に変わるので、それぞれに別の設定ファイルを作ると管理がたいへんです。
mod_cidr_lookupを使って全部統合しちゃいましょう!!
http://lab.klab.org/wiki/Mod_cidr_lookup
http://dsas.blog.klab.org/archives/51306248.html


インストールは上記リンクからダウンロードしてmake && make installするだけなので割愛!
それではさっそく・・・

キャリア判別用の設定ファイルを作る

[mikeda@cent ~]# ls /etc/httpd/conf.d/ip.d/
docomo  ezweb  local  softbank
[mikeda@cent ~]# cat /etc/httpd/conf.d/ip.d/docomo
111.89.188.0/24
111.89.189.0/24
111.89.190.0/24
...

簡単ですね!!
キャリアのIPアドレスに関する設定ファイルはこれだけです。
では冒頭の3つについて、やりかたを1つずつ説明していきます。

ApacheのIP制限

例として、携帯とローカル環境のみアクセスを許可する設定です

LoadModule  cidr_lookup_module  modules/mod_cidr_lookup.so
CIDRFile "/etc/httpd/conf.d/ip.d/*"

Alias /cidr_test /var/www/cidr_test

SetEnvIf X_CLIENT_TYPE ^(docomo|au|softbank) is_mobile
SetEnvIf X_CLIENT_TYPE ^local is_local
<Directory /var/www/cidr_test>
    Order deny,allow
    Deny from all
    Allow from env=is_mobile
    Allow from env=is_local
</Directory>

これで外部PCからのアクセスは403に!


いちばん上の2行がmod_cidr_lookupのロード、設定読み込みなので、
これを実施することで以下の処理が可能になります。

WEBプログラム

テストプログラム

<pre>
<?php
echo "\$_SERVER\n";
print_r($_SERVER);

echo "HTTP_HEADER\n";
print_r(getallheaders());
?>
</pre>

docomoのケイタイでアクセスするとこういう出力が得られます。

$_SERVER
Array
(
    [X_CLIENT_TYPE] => docomo
    [is_mobile] => 1
...
)

HTTP_HEADER
Array
(
...
    [X-Client-Type] => docomo
)

きっちり環境変数とHTTPヘッダがセットされてます!

アクセスログ集計

Apacheアクセスログフォーマットをちょっといじる

LogFormat "%h %l %u %t \"%r\" %>s %b %{X_CLIENT_TYPE}e" combined

アクセスログにキャリア情報がついてきます!!!

124.146.175.165 - - [08/Sep/2010:12:00:54 +0900] "GET /cidr_test/ HTTP/1.1" 200 1815 docomo
192.168.1.11 - - [10/Sep/2010:14:39:56 +0900] "GET /cidr_test/ HTTP/1.1" 200 2913 local


キャリアのIPアドレスに関する設定が1箇所にまとまり、
全ての環境で使用する変数が統一されて見通しもよくなったと思います。


※さらに@hirose31さんが

という超絶に便利なモノを作ってくれています
http://d.hatena.ne.jp/hirose31/20100406/1270487681