- ベストアンサー
携帯サイトでのユーザエージェントの振り分けについて
現在ドコモの携帯サイトを作成中です。 そこで以下の様に機種によってページを振り分ける予定です。 1.FOMAとmovaでまず振り分ける 2.movaの中でも505以上とそれ以下で振り分ける これらの処理をする際、ユーザエージェントを取って分岐する方法しか考えられないのですが、機種はどんどん新しいのが出ますし、その都度ソースを書き換えるのも…と思ってしまいます。 プログラミング自体自身がないので、どういう方法で振り分けるのかが最善なのか分かりません。 皆さんはどのように効率よく振り分けされているのでしょうか? よろしくお願い致します。
- ponpon-kankan
- お礼率25% (16/64)
- Perl
- 回答数3
- ありがとう数3
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> 現在phpで開発初心者で、記入されているソースの意味がいまいちわかりません ん?ここはPerlのカテゴリなんですが・・・ 今回はPerlで、ということなのかな? 一応、解説はしますが、Perlは全く分からないとなると厳しいかもしれません。 なお、「正規表現」については http://www.sixnine.net/regexp/regexp1.html が参考になるかと思います。 簡単に言えば、文字列の内容があるパターン(規則)に従っているかどうかを調べるためのもので、この時に指定するパターンやその書き方を「正規表現」といいます。 ちなみにこの方法では、No.1の補足で心配されているような、新機種の登場ごとに処理を加える必要は全くありません。 では解説を。(まずは解析ルーチンの方) > if ($ua =~ m!^DoCoMo/1\.\d/([^/]+)!) { 「$ua =~ m!正規表現!」で、$ua が mova のユーザエージェントであるかどうかを調べています。 ここでの正規表現は、 「(先頭)DoCoMo/1.(数字1文字)/(「/」でない文字が1文字以上)」 というものです。 > $info{TYPE} = 'mova'; > $info{MODEL} = $1; # 機種名 > ($info{SERIES}) = $info{MODEL} =~ /(\d+)/; info という名のハッシュ(連想配列)に、解析したデータを格納しています。 2行目の $1 は、先ほどの正規表現で ( ) で囲んでいた部分で、機種名が入っています。 3行目では、先ほどの機種名($info{MODEL})に含まれる数字の部分(シリーズ番号)を正規表現で取り出し、$info{SERIES} に格納しています。 FOMA の方も考え方は同じです。 次に分岐ルーチンの方を。 > if ($info{TYPE} eq 'FOMA') { 演算子 eq は、2つの文字列が等しいか調べます。 ※数値比較の場合は == を使いますが、文字列比較ではこちらを使います。 > if ($info{SERIES} =~ /^5/ && $info{SERIES} >= 505) { if (条件1 && 条件2) という構文はいいですよね? 1つ目の条件 $info{SERIES} =~ /^5/ は、ここでも正規表現を使い、$info{SERIES} の先頭が 5 であるか調べています。 解析ルーチンでは正規表現に / が含まれていたので m!正規表現! という書き方をしましたが、本来はここのように /正規表現/ と簡略して書くことがほとんどです。 2つ目の $info{SERIES} >= 505 は、機種のシリーズ番号を数値比較し、505 以上であることを調べています。 つまり、現状では 505 と 506 のシリーズのみが真と判定されます。 これで主要部分は解説できたと思います。 もし、本当に Perl でプログラムを書かれるなら、もう少し基礎を学ばれるとよいと思います。
その他の回答 (2)
- leaz024
- ベストアンサー率75% (398/526)
何を以って「最善」とし、何の「効率」を求めているのかが不明ですので、「後のメンテナンス」に重点をおいてアドバイスしたいと思います。 振り分け処理というのは、 ユーザエージェントを解析し、 特定の条件を満たしていたら分岐する。 という2つの要素から成ります。このうち、前者は端末側の仕様に関する部分で、後者は自分側の仕様に関する部分です。 これらがごちゃ混ぜに入り組んだコードを書いてしまうと、自分側の仕様変更なのに端末側のコードまでいじることになったりして、労力がかさむ上にバグが入りやすくなります。なので、端末側の仕様に関する「ユーザエージェント解析ルーチン」と、自分側の仕様による「条件分岐ルーチン」を別にするとよいでしょう。 解析ルーチンでは、分岐ルーチンで利用しそうな情報を全て調べます。質問に書かれた条件からは、最低でも「mova/FOMA の別」と「機種のシリーズ番号」が必要です。他にも「機種名」くらいはあるとよいかもしれません。 # 解析ルーチンの例 sub getAgentInfo { my ($ua) = @_; my %info; if ($ua =~ m!^DoCoMo/1\.\d/([^/]+)!) { $info{TYPE} = 'mova'; $info{MODEL} = $1; # 機種名 ($info{SERIES}) = $info{MODEL} =~ /(\d+)/; } elsif ($ua =~ m!^DoCoMo/2\.\d ([^(]+)!) { $info{TYPE} = 'FOMA'; $info{MODEL} = $1; ($info{SERIES}) = $info{MODEL} =~ /(\d+)/; } return %info; } ※ユーザエージェントの詳細は「DoCoMo Net(参考URL)」の「端末スペック」にある「ユーザエージェント一覧」や「ユーザエージェントの説明」などを参照してください。 ※DoCoMo/ に続くブラウザバージョンは、今のところ 1.0(mova)と 2.0(FOMA)しかありませんが、今後 . 以下の数字が変わらないとも限りませんので、正規表現 \d を使っています。 これを使った分岐ルーチンは、次のような感じです。 my %info = getAgentInfo($ENV{HTTP_USER_AGENT}); if ($info{TYPE} eq 'FOMA') { # FOMA } elsif ($info{TYPE} eq 'mova') { if ($info{SERIES} =~ /^5/ && $info{SERIES} >= 505) { # mova の 505 以上 } else { # mova の 505 未満 } } else { # その他の端末 } ※「505以上」というのがよく分からなかったので、このような書き方をしました。意図と違っていましたら修正してください。 ※コード内に全角空白を使っているので、コピーする場合はタブ等に置き換えてください。
補足
回答尾ありがとうございます。 ソースの意味はなんとなくわかりましたが、現在phpで開発初心者で、記入されているソースの意味がいまいちわかりません…(演算子?「=~」など)。すみません。 また、正規表現の意味が調べてみましたが、良くわかりません。 大変お手数ですが、意味を教えていただくとありがたいです。 よろしくお願い致します。
あのエージェント情報という奴は、本来はあくまで人間が読むためにあるもので、フォーマットに規格があるわけではありません。 よって、「現在出ている各社の書式を信じる」か「書式を何らかの形でデータベース化しておく」か、どちらかの方策しかないように思います。 前者は、たとえばNTTの場合は DoCoMo/505/..... となるわけですが、現在は「先頭の DoCoMo は常に固定で 505 の部分がカウントアップしていく」という仕様になっています。 この仕様を全面的に信じるならば、将来 DoCoMo というキャリアがなくなるまでこの書式は有効であることになります。 後者の場合、たとえば "DoCoMo\/(\d+)" といったような正規表現文字列をデータファイルに格納しておき、そのデータファイルを書き換えるだけで将来の書式変更に備える方法です。 どちらも一長一短ですので、ご自分の判断でやられたらよろしいかと思います。
お礼
回答ありがとうございます。 やはり、新機種の登場等にあわせてソースに条件を付け足して行くしかないのでしょうか…。
関連するQ&A
- htaccess ユーザーエージェント 振り分け
htaccess でユーザーエージェント 振り分けを行いました。http://www.example.com/ 以下に htaccessを入れましたが、PCのSEO対策上問題があるでしょうか? RewriteEngine On RewriteCond %{HTTP_USER_AGENT} DoCoMo RewriteRule ^$ http://www.example.com/i/index.html [R] RewriteCond %{HTTP_USER_AGENT} J-PHONE RewriteRule ^$ http://www.example.com/s/index.html [R] RewriteCond %{HTTP_USER_AGENT} Vodafone RewriteRule ^$ http://www.example.com/s/index.html [R] RewriteCond %{HTTP_USER_AGENT} SoftBank RewriteRule ^$ http://www.example.com/s/index.html [R] RewriteCond %{HTTP_USER_AGENT} UP.Browser RewriteRule ^$ http://www.example.com/e/index.html [R]
- ベストアンサー
- HTML
- 携帯サイトとPCサイトの振分け、エージェント判別以外の方法
PCサイトと携帯サイトの振分け方法でユーザーエージェントの判別で振分ける方法ではなくて、ホスト?かIPアドレス?(すいません、よくわかりません。)等で振分ける方法で振分けたいのですが、やり方がわかりません。 私はフリーのcgiのメールフォーム、ユーザーエージェントの振分けなどの単純な比較的で単純なcgiの設置なら出来る程度のレベルです。 どなたかご教授お願い致します。
- ベストアンサー
- CGI
- ユーザーエージェントの振り分け
すみません、エージェント振り分けで以下のようにPHPファイルを作りました。 そして各ホルダ i,s にindex.htmlを配置したところ Warning:Cannot modify header information headers already sent by (output started at /home/lolipop,jp-dp44253830/web/mobile/index.php:1) in/home/sites/lolipop.jp/users/lolipop.jp-dp44253830/web/mobile/index.php on line 4 index.php <?php $agent = $_SERVER['HTTP_USER_AGENT']; if(preg_match("/^DoCoMo/i", $agent)){ header("Location: http://homepege.net/mobile/i/index.html"); exit; }else if(preg_match("/^(J\-PHONE|Vodafone|MOT\-[CV]|SoftBank)/i", $agent)){ header("Location: http://homepage.net/mobile/s/index.html"); exit; 省略 } ?> お手数ですが教えてください。
- ベストアンサー
- PHP
- phpのユーザーエージェントでの振り分け方法
phpのユーザーエージェントでの振り分け方法 質問お願いします。 phpのユーザーエージェントでの振り分け方法を調べまして $ua = $_SERVER['HTTP_USER_AGENT']; if ((strpos($ua, 'Android') !== false) && (strpos($ua, 'Mobile') !== false) || (strpos($ua, 'iPhone') !== false) || (strpos($ua, 'Windows Phone') !== false)) { // スマートフォンからアクセスされた場合 header("Location: smartphone/index.html"); exit(); } elseif ((strpos($ua, 'Android') !== false) || (strpos($ua, 'iPad') !== false)) { // タブレットからアクセスされた場合 header("Location: tablet/index.html"); exit(); } elseif ((strpos($ua, 'DoCoMo') !== false) || (strpos($ua, 'KDDI') !== false) || (strpos($ua, 'SoftBank') !== false) || (strpos($ua, 'Vodafone') !== false) || (strpos($ua, 'J-PHONE') !== false)) { // 携帯からアクセスされた場合 header("Location: mobile/index.html"); exit(); } else { // その他(PC)からアクセスされた場合 header("Location: pc/index.html"); exit(); } とコピペで記入してスマホなどを振り分けています。 safari6とsafari7で見た時だけ header("Location: tablet/index.html"); に振り分けたいのですが、どうしたらよいでしょうか? 素人ですいません。 宜しくお願い致します。
- ベストアンサー
- PHP
- ユーザーエージェントの入手方法
今学校の課題で調べているのですが、携帯電話からサイトへアクセスされたとき、ユーザーエージェントを使ってどの機種からアクセスされたか調べたいのですが、そのユーザーエージェントの入手方法が分かりません。 分かりにくい質問になってしまったかも知れませんが、どなたか知っている方がいましたら教えてください!
- ベストアンサー
- その他([技術者向] コンピューター)
- DoCoMoの携帯でMOVAのPとN
DoCoMoの携帯でFOMAではなくMOVAを買いたいと思うのですが、 例年なら新しい機種が出ていることだと思うのですが、 MOVAの507シリーズが出ていないのは、DoCoMoはもう507は作らずに FOMAにしようとしているのでしょうか? 506で終わりなのでしょうか? FOMAはバグが多いし、重いのでまだMOVAで以降と考えているだけに 早く新機種が出てほしいのですが。 また、PシリーズとNシリーズではどちらがキーレスポンスが 早いでしょうか? 実体験のある方お願いします
- ベストアンサー
- その他(スマートフォン・携帯・タブレット)
- レスポンシブでなくユーザーエージェントでサイト構築
レスポンシブではなく、ユーザーエージェントで切り替わるサイトを作ろうと あれこれリサーチをしております。そこで見つけたのが下記サイト。 http://mery.jp/ レスポンシブではなく、訪問した媒体でページが切り替わります。 スマフォで見るとページ上部にメニューボタンが出ます。 YouTubeのようにメイン画面が右にずれてメニューが表示されるというもの。 こんな感じで作りたいなと思ったのですが、 パソコンで見た時とスマフォで見た時にHTMLの構造が違っておりました。 CSSの振り分けだけを行っているのかと思っていたのですがそうではないのか? 一番わかりやすいかと思うのが、そのメニュー。 パソコンでソースを表示させると見るとそのメニューのソースがどこにもありません。 しかしスマフォ版のものをパソコンで表示してソースを見るとソースがちゃんとあります。 HTMLひとつで振り分けるとなるとそのソースは記載されていて、 パソコン用のCSSが「dispaly:none」 スマフォ用のCSSが「dispaly:block」 にしているだけだと思っていました。 このサイトの場合、そうではない手段をとっているのかと思いますが、 どんな手段をとっているのかお分かりの方いらっしゃいますでしょうか。 ご教授いただければ幸いです。
- ベストアンサー
- CSS
- 同一URLで携帯サイトとPCサイトの振り分け方を教えてください。
はじめまして。 実はこのたび携帯サイトの制作を頼まれたのですが、その方は将来的にはPCサイトも同一のURLで開設を考えているとのことです。 そこで、いろいろ調べ回ったところユーザーエージェントによる振り分け機能というものがあることを知りました。 しかし、私はHTMLについては少々知識はあるのですが、PHP等のプログラミングについては全くの初心者です。 どこに何を配置すればこのような振り分け機能が動作するのかわかりません。 どうか教えていただけないでしょうか?
- ベストアンサー
- PHP
- phpでエージェントの振り分けがうまくいかない
phpでエージェントの振り分けがうまくいかない 以下のようにmフォルダの中にindex.phpを以下の内容で設置し、同列でi,a,sフォルダを設け それぞれindex.htmlを設けました。しかし携帯でhttp://hoge.com/m で打つとサイトがみつかりませんになります。<?phpより上は空白、改行はありません。 振り分けがうまく機能しないのはなぜでしょうか? <?php $agent = $_SERVER['HTTP_USER_AGENT']; if(preg_match("/^DoCoMo/i", $agent)){ header("Location: http://hoge.com/m/i/index.html"); exit; }else if(preg_match("/^(J?-PHONE|Vodafone|MOT?-[CV]|SoftBank)/i", $agent)){ header("Location: http://hoge.com/m/s/index.html"); exit; }else if(preg_match("/^KDDI?-/i", $agent) || preg_match("/UP?.Browser/i", $agent)){ header("Location: http://hoge.com/m/a/index.html"); exit; }else{ header("Location: http://hoge.com/index.php"); exit; } ?>
- ベストアンサー
- PHP
- 携帯の機種変更について
こんにちは。機種変更の事で教えてください。 現在、DOCOMO2台使用の内1台がMOVAなのでFOMAに変更を考えています。1月31日までの1万5千円の割引(MOVA→FOMA機種限定?)などを生かして、出来るだけ安く変更したいのです。機種には余りコダワリはありません。ただPCを所持していないので、詳しい事を調べられません。ドコモショップに行けば?というのは当然ですが、ある程度の予備知識を持って変更に行きたいと思っています。ちなみにポイントは8500位です。いろんな助言をお願いします。
- 締切済み
- docomo
お礼
すみません、質問をするカテゴリを間違えていたようです…。 開発もphpで行っています。 しかし、説明でよく分かり、目的の判別ができました! ありがとうございました!