-
ケータイサイトでPCアクセスをBASIC認証
ケータイサイトでPCからのアクセスを制限すると、自分のPCのFireFox + UserAgentSwitcherや各キャリアのシミュレータで表示確認できなくなります。私はPCのほうに慣れているので、これは不便です。
事務所のIPアドレスが固定なら、そのIPアドレスを許可リストに追加します。しかし、関係者全員が固定IPをもっているともかぎりません。
そこで、PCからのアクセスはBASIC認証で許可します。.htaccess に「Satisfy Any」を記述します。
# BASIC認証 AuthUserFile /path/to/.htpasswd AuthGroupFile /dev/null AuthName "Type your password please." AuthType Basic require valid-user Satisfy Any order deny,allow deny from all # imode allow from 210.153.84.0/24 allow from 210.136.161.0/24 .... 以下、省略 ....
-
ケータイのIPアドレス
ケータイサイトでPCからのアクセスを禁止したいとき、ケータイからのIPアドレスだけを許可します。また、ケータイ向けの検索エンジンのクローラも許可します。
次のリストは、各キャリアの公式サイトからIPアドレスを取り出したものです。メールやPCビューワからのIPアドレスは含んでいません。これらのIPアドレスはときどき変更されるので、メンテナンスが必要です。
order deny,allow deny from all # i-mode # http://www.nttdocomo.co.jp/service/imode/make/content/ip/index.html allow from 210.153.84.0/24 allow from 210.136.161.0/24 allow from 210.153.86.0/24 allow from 124.146.174.0/24
# EZweb # http://www.au.kddi.com/ezfactory/tec/spec/ezsava_ip.html allow from 210.230.128.224/28 allow from 121.111.227.160/27 allow from 61.117.1.0/28 allow from 219.108.158.0/27 allow from 219.125.146.0/28 allow from 61.117.2.32/29 allow from 61.117.2.40/29 allow from 219.108.158.40/29 allow from 219.125.148.0/25 allow from 222.5.63.0/25 allow from 222.5.63.128/25 allow from 222.5.62.128/25 allow from 59.135.38.128/25 allow from 219.108.157.0/25 allow from 219.125.145.0/25 allow from 121.111.231.0/25 allow from 121.111.227.0/25 allow from 118.152.214.192/26 allow from 118.159.131.0/25 allow from 118.159.133.0/25 allow from 118.159.132.160/27
# softbank # http://creation.mb.softbank.jp/web/web_ip.html allow from 123.108.236.0/24 allow from 123.108.237.0/27 allow from 202.179.204.0/24 allow from 202.253.96.224/27 allow from 210.146.7.192/26 allow from 210.146.60.192/26 allow from 210.151.9.128/26 allow from 210.169.130.112/28 allow from 210.175.1.128/25 allow from 210.228.189.0/24 allow from 211.8.159.128/25
#------------------------------------------------------------ # ケータイ向けの検索クローラ #------------------------------------------------------------ # moba-crawler # http://crawler.dena.jp/ allow from 202.238.103.126 allow from 202.213.221.97
# froute # http://search.froute.jp/howto/crawler.html allow from 60.43.36.253
# モバイルgoo # http://help.goo.ne.jp/help/article/1142/ allow from 210.150.10.32/27 allow from 203.131.250.0/24
# Livedoor # http://helpguide.livedoor.com/help/search/qa/grp627 allow from 203.104.254.0/24
# Google # http://googlejapan.blogspot.com/2008/05/google.html allow from 72.14.199.0/25 allow from 209.85.238.0/25
# Yahoo! # http://help.yahoo.co.jp/help/jp/search/indexing/indexing-27.html allow from 124.83.159.146/27 allow from 124.83.159.178/29 allow from 124.83.159.224/28 allow from 124.83.159.240/29
# MSN Search # (Microsoft社のIP範囲からMSNクローラがアクセスしてくる、ということらしいです) allow from 65.52.0.0/14
-
PEAR::Net_UserAgent_Mobile用のi-mode機種情報xml
Smarty動的Webサイト構築入門の5.3 Smartyとケータイで、PEAR::Net_UserAgent_Mobileパッケージを使っています。このパッケージは外部ファイルからi-mode機種情報を読み込むことができます。本の付録CDROMに、筆者作成のdocomo_netuamobile.xmlを収録しました。
ところが、このdocomo_netuamobile.xmlには不具合があり、下から5~6行目の「SO902WP+」以降を正しく読み込みません。次の2点の修正が必要です。
1点目は、docomo_netuamobile.xmlです。「SO902WP+」ではなく、「SO902WPplus」とします。次のファイルは、2008/9/21時点で、288機種あります。
docomo_netuamobile.xmlのダウンロードページ
2点目は、keitai_ini.phpを修正して、「SO902WP+」自体を認識できるようにします。SO902WP+の場合は、Net_UserAgent_Mobile内部の機種情報を使い、そうでない場合は、docomo_netuamobile.xmlを使うようにします。
修正前
7: $_SERVER['DOCOMO_MAP'] = dirname(__FILE__) . “/docomo_netuamobile.xml”;
8: $agent = &Net_UserAgent_Mobile::factory();
9: $display = $agent->getDisplay();修正後
7: if ( ! preg_match(‘/SO902iWP[+]/’, $_SERVER['HTTP_USER_AGENT']) ) {
8: $_SERVER['DOCOMO_MAP'] = dirname(__FILE__) . “/docomo_netuamobile.xml”;
9: }
10: $agent = &Net_UserAgent_Mobile::factory();
11: $display = $agent->getDisplay(); -
Softbank携帯で音声3gpをダウンロードできない
Softbank携帯(802SH)で、音声3gpをダウンロードしようとすると、「エラーが発生しました。レスポンスが不正です。(WJ46098E)」と表示される現象がありました。動画3gpは問題なくダウンロード・再生できるのに、なぜ?
3gpファイルは、PHPで吐き出しています。ファイル名は $_SERVER['PATH_INFO'] からとってきます。こんな感じです。
<href=”download.php/xxx/yyy.3gp”>ダウンロード</a>実はセッションを使っていて、session_cache_limiter(‘nocache’)が原因でした。まる一日かかった、その途中経過は...
まず、確認したことは、
・PHPを使わず、3gpファイルに直接アクセスしたら?
→携帯にダウンロードできた。
・”download.php/xxx/yyy.3gp にwgetでアクセスしてみたら?
→元ファイルと同じ内容で保存でき、再生もできた。
なので、ファイルを読んで、吐き出す処理自体に問題はないようです。次に、レスポンスヘッダを比較しました。セッションを使っているので、セッションIDがクッキーにありますね。むむっ?「Cache-Control」がずいぶん長い!
直接アクセス cache-control: no-cache PHP吐き出し Set-Cookie: PHPSESSID=********; path=/ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, (続き) pre-check=0 Pragma: no-cache
テスト用のPHPを組んで、どの行が原因か調べました。結果は「Cache-Control」に「no-store」があるとエラーでした。技術資料http編に「no-store」が記載されていますが、全ての機種で対応していない、ということなのでしょうか。
Cache-Control: no-store →× Cache-Control: no-cache, must-revalidate, post-check=0, pre-check=0 →○
session_cache_limiter の値で、レスポンスヘッダがどう変わるか調べました。
session_cache_limiter('public' ) ↓ Expires: Wed, 02 Jan 2008 09:43:55 GMT Cache-Control: public, max-age=10800 session_cache_limiter('private') ↓ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: private, max-age=10800, pre-check=10800 session_cache_limiter('private_no_expire') ↓ Cache-Control: private, max-age=10800, pre-check=10800 session_cache_limiter('nocache') ↓ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, (続き) pre-check=0もともとsession_cache_limiter()を呼んでいなかったので、デフォルトの’nocache’だったようです。’private_no_expire’ にしたところ、音声3gpファイルをダウンロード・再生ができるようになりました。
音声3gpファイル用のディレクトリに置く .htaccess の例AddType audio/3gpp .3gp AddType audio/3gpp2 .3g2 Header set cache-control "no-cache" Header set x-jphone-copyright "no-transfer"
802SHでは、「x-jphone-copyright “no-transfer”」がない場合、
・動画3gp → ○ダウンロード・再生
・音声3gp → ×「エラーが発生しました。レスポンスが不正です。(WJ46098E)」
でした。 -
PHP:ケータイのキャリア判別
アクセスしてきたケータイがi-mode/EZweb/SoftBankかの判定は、かつてはUserAgentだけで判別していました。しかし、vodafoneの一部機種はUserAgentに”UP.Browser”を含んでいたり、UserAgentに”vodafone”がなかったりします。今後もUserAgentがイレギュラーな新機種が発売される可能性もあり、UserAgentだけに頼るのは無理があるようです。
今回紹介する方法は、UserAgentと他の変数を使う方法です。UserAgentで判別できない場合は、SoftBank特有・EZweb特有の変数があるかどうかを調べます。もし新機種が発売されて、UserAgentで判別できなかったとしても「未対応です」と表示せずにすみます。
例えば、Smartyのテンプレートを切替えたい場合は、templates/0/hoge.tpl ~ templates/3/hoge.tpl を用意して、次のように使います。
require_once( 'bc.inc.php' ); $n = BC_get_carrier(); $smarty->display( "$n/hoge.tpl" );
各キャリアごとのディレクトリ名を数字にするのは、正直なところ私もしっくりきません。”pc”/”i”/”ez”/”sb”などにしたいところです。しかし、J-PHONE→vodafone→SoftBankと社名変更があったので、考えざるを得ません。数字が一番気にならないと思います。
以下を適当なファイル名(例えばbc.inc.php)で保存してください。(<?php と ?>で囲んでください。)
define( "BC_PC" , 0 ); define( "BC_EZWEB" , 1 ); define( "BC_VODAFONE" , 2 ); define( "BC_SOFTBANK" , 2 ); define( "BC_IMODE" , 3 ); function BC_get_carrier () { $ua = $_SERVER['HTTP_USER_AGENT']; $ca = BC_PC; if ( preg_match('/docomo/i', $ua) ) { $ca = BC_IMODE; } else if ( preg_match('/j-phone|vodafone|softbank/i', $ua) ) { $ca = BC_SOFTBANK; } else if ( preg_match('/J-EMULATOR|Vemulator/i', $ua) ) { $ca = BC_SOFTBANK; } else if ( preg_match('/kddi/i', $ua) ) { $ca = BC_EZWEB; } else if ( isset($_SERVER['HTTP_X_JPHONE_DISPLAY']) ) { $ca = BC_SOFTBANK; } else if ( isset($_SERVER['HTTP_X_EMULATOR_DISPLAY']) ) { $ca = BC_SOFTBANK; } else if ( isset($_SERVER['HTTP_X_UP_SUBNO']) ) { $ca = BC_EZWEB; } else if ( isset($_SERVER['HTTP_X_UP_DEVCAP_SCREENPIXELS']) ) { $ca = BC_EZWEB; } return $ca; }なお、もっとも確実な方法は、アクセス元のIPアドレス(REMOTE_ADDR)で判別する方法です。各キャリアごとにゲートウェイのIPアドレス範囲が公開されています。IPアドレス範囲は、ごくたま~に変更されるので、定期的に各キャリアの技術ページをチェックする必要があります。




最近のコメント