ホームページ >バックエンド開発 >PHPチュートリアル >アクセス端末がコンピュータか携帯電話かを判断する方法_PHP チュートリアル
インターネット上には 3 つの意見があります。1 つはブラウザから送信されるユーザー エージェントに基づいていますが、明らかにこの方法は機能しません。携帯電話から送信されるユーザー エージェントのほとんどをリストしている人もいます。携帯電話を認識できず、一部の携帯ブラウザでは User-Agent を送信しないことも多く、今後新しいブランドがリリースされないという保証はありません。
以下はphpの例です。これを読めば、それがいかに信頼できないかがわかります。
1.関数 is_wap(){2. $ua = strto lower($_SERVER['HTTP_USER_AGENT']);
3. $uachar = "/(nokia|sony|ericsson|mot|samsung|sgh|lg|sie|philips|panasonic|alcatel|lenovo|cldc|midp|wap|mobile)/i";
4. if(($ua == '' || preg_match($uachar, $ua))&& !strpos(strto lower($_SERVER['REQUEST_URI']),'wap')){
5. trueを返す;
6. }その他{
7. return false;
8. }
9. }
もう 1 つは HTTP_ACCEPT の判定ですが、これは比較的信頼できるはずですが、HTTP_ACCEPT は非常に複雑です。一般的なブラウザが html をサポートしていない場合は、ブラウザが wml をサポートしているかどうかを判断するだけで済みます。ただし、ブラウザが wml と html の両方をサポートしている場合は困難になります。ローエンドの携帯電話では html の前に wml が配置される場合がありますが、多くのハイエンドの携帯電話やスマートフォンでは html が適切にサポートされているため、html も表示されます。 wmlの前で
これは BlackBerry によって送信された HTTP_ACCEPT です
application/vnd.rim.html,
text/html,
application/vnd.wap.xhtml+xml,
text/vnd.sun.j2me.app-descriptor,
image/vnd.rim.png,image/jpeg,
application/x-vnd.rim.pme.b,
application/vnd.rim.ucs,
image/gif;anim=1,
application/vnd.rim.jscriptc;v=0-8-8,
application/x-javascript,
application/vnd.rim.css;v=1,
text/css;media=ハンドヘルド,
application/vnd.wap.wmlc;q=0.9,
application/vnd.wap.wmlscriptc;q=0.7,
text/vnd.wap.wml;q=0.7,
*/*;q=0.5
誇張ですよね? しかし、開発者はこれに基づいて多くの情報を得ることができますが、多くの携帯電話では、IE または FF の HTTP_ACCEPT が非常に短いことがわかります。
text/html,
application/xhtml+xml,
application/xml;q=0.9,
*/*;q=0.8
同様にphpの例をあげておきます
if (isset($_SERVER['HTTP_ACCEPT']) &&
(strpos($_SERVER['HTTP_ACCEPT'],'vnd.wap.wml')!==FALSE)
&& (strpos($_SERVER['HTTP_ACCEPT'],'text/html')===FALSE ||
(strpos($_SERVER['HTTP_ACCEPT'],'vnd.wap.wml') <
strpos($_SERVER['HTTP_ACCEPT'],'text/html'))
)) {//モバイルアクセス
readfile('index.wml');
} else readfile('index.htm');
原則: ブラウザが WML をサポートしていて、[HTML をサポートしていない] または [WML が HTML より優先される] 場合、携帯電話であると判断されます。しかし、実際には、この原則は間違っています。
もう1つの方法は、ゲートウェイまたはIPを決定することですが、これは非常に信頼性が低いと思います。たとえば、開発中にエミュレータを使用しました。これには例は必要ありません。十分です。
上記は今朝の私の作業の結果ですが、実際にはまだ完璧な解決策を見つけていません。質問がある場合は追加するか、メッセージを送ってください。より良い方法がありますので、共有していただければ幸いです。
最近、私は携帯電話のクエリシステムに取り組んでいましたが、これには当然この問題が含まれていました。次に、WAP についての理解に基づいて、ユーザーのアクセス方法が WAP アクセスによるものであるか、コンピューターからの直接アクセスであるかを判断します。
まず最も根本的な解決策について話しましょう:
携帯電話からアクセスする場合、ユーザーエージェント情報には携帯電話番号情報が含まれますので、携帯電話番号を取得できれば、確実にモバイルワップ経由でアクセスできます。ただし、チャイナモバイルは現在ユーザーエージェント情報をブロックしているため、携帯電話番号を取得することはできません。関係のある友人は携帯会社に連絡し、WAP Web サイトサーバーの IP をチャイナモバイルに送信してホワイトリストに追加すると、UA 情報を取得できます。現在、チャイナユニコムは携帯電話番号を直接取得できるため、このソリューションはユニコムユーザーに完全に実装できます。
次に、私の解決策について話しましょう:
携帯電話からのアクセスは、携帯会社のプロキシサーバーを経由してアクセスするのが原則です。そうすれば、通常のコンピュータがプロキシ サーバーを使用していることがわかります。携帯電話がプロキシサーバー経由でアクセスする場合、http ヘッダー情報には必ず via という情報が含まれます。この情報は貴重な判断情報を提供します。
たとえば、Henan Mobile が取得する経由情報は次のとおりです:
http/1.1 hazz-b-gw001-wap(infox-wisg、huawei technology)
河南ユニコムの経由情報は次のとおりです:
zxwapゲートウェイ、zteテクノロジーズ
他の地方の http ヘッダー情報も同様です。携帯電話でアクセスできるかどうかを判断する方法は次のとおりです。http の via 情報文字列を取得して、wap 文字が含まれているかどうかを確認します。そうである場合は、携帯電話でアクセスします。この結果、誰も携帯電話へのアクセスを偽ることはできず、その判断は完全に正確です。当然のことながら、これはインターネット上で人気のある携帯電話の wap シミュレーターもブロックし、根本的にブロックします。
操作コードも非常にシンプルです:
// xhatでwapかどうかをチェック
関数 check_wap() {
return stristr($_SERVER['HTTP_VIA'],"wap") ? true : false;
}
// チェックしてください
私が検討した情報から判断すると、この方法は、これまでのところ、インターネット上での携帯電話のアクセスを判断する最も正確かつ簡単な方法であるはずです。
上記の方法では、アクセス元が携帯電話かパソコンかを判断することができますが、問題点としては、携帯電話からしかアクセスできず、WAP対応のブラウザや携帯電話シミュレータではアクセスできないという点があります。テストでは制限がなくなり、少し混乱します。
以下のプランです:
ブラウザのプロキシ識別子とWAP対応ブラウザかどうかを判断してアクセスページを決定します。この欠点の 1 つは、すべての携帯電話のすべてのブラウザ ID とサポートされているブラウザ ID をリストすることができないことです。
実装されたコードを見てみましょう:
関数check_wap()
{
if (strpos(strtoupper($_SERVER['HTTP_ACCEPT']),"VND.WAP.WML") > 0)
{
// ブラウザ/ゲートウェイが WML を受け入れると言っているかどうかを確認します。
$br = "WML";
}
その他
{
$browser=substr(trim($_SERVER['HTTP_USER_AGENT']),0,4);
if ($browser=="Noki" || // Nokia の携帯電話とエミュレータ
$browser=="Eric" || // Ericsson WAP 電話とエミュレータ
$browser=="WapI" || // エリクソン WapIDE 2.0
$browser=="MC21" || // エリクソン MC218
$browser=="AUR" || // エリクソン R320
$browser=="R380" || エリクソン R380
$browser=="UP.B" || // UP.ブラウザ
$browser=="WinW" || // WinWAP ブラウザ
$browser=="UPG1" || UP.SDK 4.0
$browser=="upsi" || // 別の種類の UP.Browser ??
$browser=="QWAP" || // 不明な QWAPPER ブラウザ
$browser=="Jigs" || // 不明な JigSaw ブラウザ
$browser=="Java" || // 不明な Java ベースのブラウザ
$browser=="Alca" || // 不明な Alcatel-BE3 ブラウザ (UP ベース?)
$browser=="MITS" || // 不明な三菱ブラウザ
$browser=="MOT-" || // 不明なブラウザ (UP ベース?)
$browser=="My S" ||// 不明な Ericsson 開発キット ブラウザ ?
$browser=="WAPJ" || // 仮想 WAPJAG www.wapjag.de
$browser=="fetc" || // fetchpage.cgi www.wapcab.de からの Perl スクリプト
$browser=="ALAV" || // さらに別の未知の UP ベースのブラウザ ?
$browser=="Wapa" || // 別の未知のブラウザ (Web ベースの "Wapalyzer"?)
$browser=="Oper") // オペラ
{
$br = "WML";
}
その他
{
$br = "HTML";
}
}
if($br == "WML")
{
TRUE を返します;
}
その他
{
FALSEを返す;
}
}
if(!check_wap())
{
Header("場所: http://www.xker.com/");
exit();
}