PHP、Smarty、ケータイサイトについて発信中。書籍 「Smarty動的webサイト構築入門」(技術評論社) 好評発売中
RSS icon Home icon
  • ケータイサイトで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
     .... 以下、省略 ....
    2009-05-18 aoki No comments 04.ケータイ
  • ケータイの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
    2009-05-12 aoki No comments 04.ケータイ
  • 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();

    Smarty動的Webサイト構築入門
    Amazon.co.jpの詳細ページへ

  • 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)」
    でした。

    2008-01-02 admin No comments 02.PHP, 04.ケータイ
  • 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アドレス範囲は、ごくたま~に変更されるので、定期的に各キャリアの技術ページをチェックする必要があります。

    2007-05-28 admin No comments 02.PHP, 04.ケータイ