- ベストアンサー
携帯サイト【PCからのアクセスを飛ばしたい】
- 携帯サイトでPCからのアクセスを飛ばす方法について教えてください。
- 携帯用トップページにアクセスがあった場合、携帯端末ならそのまま表示させ、PCからのアクセスならPC用トップページに移動させることは可能でしょうか?
- PHPを使用して携帯サイトでPCからのアクセスを飛ばす方法について詳しく教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
フラットに書いてしまいましたが、ipの範囲を計算する部分を関数にでもしておきます。 ipとサブネットマスクのビット長は、CSVにでも入れておけばいいでしょう。 210.230.128.224,8 続く これを、とりあえずip.csvとでもしておきます。 次のようなプログラムではどうでしょう? テストは一切していませんので、ご了承を。 これは、ブラウザから動かす必要はありません。 コマンドラインから実行できます。 <?php ここで、データベースへの接続など。 とりあえず、PDOを使うとして、接続結果が$dbに入ったとする この下のinsert文は適宜書き換えること $sth = $db->prepare('INSERT INTO mobileip(min, max) values(?,?)'); function addRange($ip, $sm, $sth) { $parts = explode('.', $ip); $lowest = ((($parts[0] * 256 + $parts[1]) * 256) + $parts[2]) * 256 + $parts[3]; $highest = $lowest + (0xffffffff >> $sm); $sth->execute(array($lowest, $heighest)); } $ranges = file('ip.csv'); foreach($ranges as $range) { list($ip, $sm) = explode(',', trim($range)); addRange($ip, $sm, $sth); } PCのときに飛ばすのは、 $_SERVER['REMOTE_ADDR']の値を10進変換した変数が$iだとしたら、 $sth = $db->prepare('SELECT COUNT(*) FROM mobileip WHERE ? BETWEEN min and max'); $sth->execute(array($i)); とでもします。 結果が1ならば、mobile、それ以外はPCとみなして、 headerでそれぞれに飛ばせばいいでしょう。
その他の回答 (2)
- masa6272
- ベストアンサー率66% (93/140)
まず、ipアドレスの範囲をテーブルに入れておきます。 たとえば、au kddiの帯域テーブルの 210.230.128.224/28 を例にとりましょう。 色々方法はあると思いますが、IPアドレスを10進に変換して入れておけばいいでしょう。 たとえば、次のようにして、範囲の上限/下限の10進数表現は求まります。 <?php $ip = '210.230.128.224'; $m = 28; $parts = explode('.', $ip); $lowest = ((($parts[0] * 256 + $parts[1]) * 256) + $parts[2]) * 256 + $parts[3]; $highest = $lowest + (0xffffffff >> $m); この、$lowestと$highestをテーブルに入れておきます。 $_SERVER['REMOTE_ADDR']の値を10進に変換して、このテーブルのIPアドレスの範囲に範囲に入っていれば、携帯からのアクセスです。 テーブルは、最低限上限/下限が入っていればいいのですが、ついでにキャリアも入れておくと、後で役に立つかもしれません。
お礼
masa6272さん >> たびたび、丁寧なご回答ありがとうございます。 おっしゃっていることが、 ようやく少しずつ理解できてきましたが、 あと少しだけご教授お願い出来ますでしょうか? ipアドレスのテーブルへの入れ方、 これを10進へ変換することは理解できました。 あと疑問が2つあるのですが…。 <?php $ip = '210.230.128.224'; $m = 28; $parts = explode('.', $ip); $lowest = ((($parts[0] * 256 + $parts[1]) * 256) + $parts[2]) * 256 + $parts[3]; $highest = $lowest + (0xffffffff >> $m); 教えて下さったサンプルなのですが、 $ip = '210.230.128.224'; $m = 28; これは幾つもあるau KDDIのipだと思うのですが、 これらを今後追加していくに当たっては、 どのように増やしていったら宜しいのでしょうか? $ip[0] = '210.230.128.224'; $m = 28; $ip[1] = '省略… $m = 28; このように括弧で増やしていけばいいのでしょうか? あと最後にもう一点;; テーブル内に入れてある以外のものからのアクセス、 今回のケースですとPCからのアクセスのみ自動的に飛ばしたいときは、 どのように記述すればいいのでしょうか? 幾度も質問を重ねてしまい、 大変申し訳なく思いますが、ご回答頂けたらと思います。 よろしくお願い致します。
- masa6272
- ベストアンサー率66% (93/140)
$_SERVER['REMOTE_ADDR']の値で判断するのがいいでしょう。 この値は、偽装が難しいですし、偽装すると偽装した方に結果が送られるので、通信が成立しません。偽装する意味が余りありません。 IPアドレスの帯域リストは各キャリアのページを参照してください。 携帯 ip帯域 + キャリア でぐぐれば、出てきます。 kddiとdocomoのページを挙げておきます。 後は、調べてください。 http://www.au.kddi.com/ezfactory/tec/spec/ezsava_ip.html http://www.nttdocomo.co.jp/service/imode/make/content/ip/ で、この帯域をテーブルにでも入れておいて、判断すればいいでしょう。 なお、更新されることもあるので、たまに見ておく必要があります。
お礼
masa6272さん >> お礼遅くなってしまい申し訳ありません。 早速、自分なりに調べてみたのですが、 当方PHP初心者の為、よく理解が出来ませんでした…。 教えて下さった内容は、 <?php echo $_SERVER["REMOTE_ADDR"]; ?> で宜しいのでしょうか? これを拡張子.phpで保存し、サーバへアップすると、 IPアドレスが表示されるんでしょうか。 >>この帯域をテーブルにでも入れておいて、判断すればいいでしょう 教えてくださっていることは、 大よそ理解できる(しているつもり)のですが、 テーブルにでも入れてのところが分かりません;; 各キャリアの公式サイトに公開されている、 IPアドレスを入力して分けたほうが良いということを、 指していると思うのですが、 このIPアドレスをどこに記述するのか教えていただけないでしょうか?
お礼
masa6272さん >> 度重なる質問に対して、 丁寧かつ素早い返答本当に助かりました^^ なんとか形になりつつあります…。 masa6272さんのサポートのお蔭です♪ 本当にありがとうございました。 自分もこの機会にPHP少し勉強してみようと思います。 それでは、質問締め切りさせて頂きますね^^