ブラウザの言語に合わせて表示ページを振り分ける方法とは?

このQ&Aのポイント
  • ブラウザの言語に合わせて表示するページを制御するためには、リダイレクト処理を使用する方法があります。
  • 要件を満たしつつ、閲覧環境に合わせて表示するページを制御するためには、HTTP_ACCEPT_LANGUAGEヘッダを使用してブラウザの言語情報を取得し、その情報に基づいてリダイレクトを行います。
  • ただし、検索エンジンのクローラが正しいページをクロールできるようにするためには、正しいサイトマップを提供することも重要です。
回答を見る
  • ベストアンサー

ブラウザの言語に合わせて表示ページを振り分けたい

http://www.abc.ne.jp/ // 日本語サイトルート http://www.abc.ne.jp/en/ // 英語サイトルート という構成のサイトを海外から検索・閲覧する時にhttp://www.abc.ne.jp/en/の方を表示するように修正したいと考えています。 (1)ページランクは下げたくない http://www.abc.ne.jp/に下記のようなソースのindex.phpを置き、http://www.abc.ne.jp/jp/または http://www.abc.ne.jp/index_jp.phpを作成し日本語サイトトップページとする場合、index.phpがコンテンツのないリダイレクトするだけのファイルになってしまうため、SEO上好ましくないのではないかと考えています。 【ソース】 $languages = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']); $languages = array_reverse($languages); foreach ($languages as $language) {  if (preg_match('/^ja/i', $language)) {   header("Location: http://www.abc.ne.jp/jp/");  } else {   header("Location: http://www.abc.ne.jp/en/");  } } (2)閲覧者の表示言語の選択肢は残したい 現状通りの構成でhttp://www.abc.ne.jp/index.phpに下記のようなソースを記述し、英語環境からアクセスされたらhttp://www.abc.ne.jp/en/へリダイレクトする場合、日本語のページを見たい場合でも強制的にhttp://www.abc.ne.jp/en/へリダイレクトされてしまいます。 【ソース】 $languages = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']); $languages = array_reverse($languages); foreach ($languages as $language) {  if (preg_match('/^en/i', $language)) { // http://www.abc.ne.jp/en/にはpreg_match('/^ja/i', $language)   header("Location: http://www.abc.ne.jp/en/");  } } (1)、(2)の要件を満たしつつ、閲覧環境に合わせて表示するページを制御することは可能でしょうか。 良い方法があればご教示ください。 よろしくお願いします。

  • PHP
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • nazal2010
  • ベストアンサー率54% (12/22)
回答No.2

>(1)ページランクは下げたくない トップページからのリダイレクトは止めたほうがいいと思います。 以前リダイレクトさせた時に、一気に圏外まで落とされました・・・。 Smarty等のテンプレートエンジンを使用する方法は手遅れでしょうか? もしガッチリ作り込みされているシステムでしたら、今更?って感じですが、 テンプレートエンジンの選択肢がOKであれば、HTTP_ACCEPT_LANGUAGEで識別して 日本語と英語それぞれの、該当のテンプレートファイルを呼び出せば良いと思います。 >(2)閲覧者の表示言語の選択肢は残したい Smarty等のテンプレートエンジンを使用する選択肢がOKであれば、 http://www.abc.ne.jp/index.php で、(1)は解決しますので、 ご提示されているように、 http://www.abc.ne.jp/en/ とディレクトリを用意し、http://www.abc.ne.jp/index.phpの 英語のコンテンツと全く同じものを「 en 」ディレクトリに設置します。 但し、HTTP_ACCEPT_LANGUAGEの制御はこのディレクト内では行わないようにします。 では、お役に立てれば幸いです。

Abdiel
質問者

お礼

nazal2010様 ありがとうございます。 Smartyを使用すれば実現可能なのですね。 あいにく私が勉強不足なため、ご提案の手法は導入できませんが、次回以降のため勉強しておきたいと思います。

その他の回答 (1)

  • t_ohta
  • ベストアンサー率38% (5068/13243)
回答No.1

自動で振り分けるのではなく、閲覧者に選ばせるのが一番いい選択ではないでしょうか。 多言語で作成しているサイトではよくある導線だと思います。 どうしても選ばせるのがダメだと言うことであれば、全てのページに言語切り替えのリンクを表示するようにして、cookieに選択された言語を入れるようにして判定に使い、cookieが無いときだけHTTP_ACCEPT_LANGUAGEの値を見て振り分けるというのも手ではないでしょうか。 これも多言語で作成しているサイトでよくある機能だと思います。 ブラウザの言語設定は、普通の人はいじらないので結構いい加減だったりします。 一般的にはOSの言語設定を元に初期設定されている場合が多いですが、OSの言語と利用者の言語が一致しているとは限りませんので、利用者が選択する方法がいいと思います。

Abdiel
質問者

お礼

t_ohta様 ありがとうございます。 ひとまず自動振り分けではなく閲覧者に選んでいただく形にしたいと思います。

関連するQ&A

  • 携帯とPCの振り分け

    同じドメインにて携帯とPCの振り分けなのですが、htaccessにて振り分けたのですが、ブラウザに「振り分けがループしています」とでるのですが、 これはなぜでしょう? htaccessの中身の内容ですが、 DirectoryIndex index.php index.html index.htm これで読み込んだindex.phpの中身は <?php $agent = $_SERVER['HTTP_USER_AGENT']; if(preg_match("/^DoCoMo/i", $agent)){ header("Location: http://www.○○○○○.com/mobile/index.xhtml"); exit; }else if(preg_match("/^(J\-PHONE|Vodafone|MOT\-[CV]|SoftBank)/i", $agent)){ header("Location: http://www.○○○○○.com/mobile/index.xhtml"); exit; }else if(preg_match("/^KDDI\-/i", $agent) || preg_match("/UP\.Browser/i", $agent)){ header("Location: http://www.○○○○○.com/mobile/index.xhtml"); exit; }else{ header("Location: http://www.○○○○○.com/"); exit; } ?> サーバはlolipopでhtaccessのパーミッションは604で phpのパーミッションは700です。

    • 締切済み
    • CGI
  • i Phone 用振り分け

    以下のように携帯キャリアごとに振り分け、3キャリア以外は PCフォルダに振り分けるようにした場合ですが、PCフォルダの方で i Phone 用に幅480pxで作成したページを配置すると PCから http://mypage.net/ でアクセスしたユーザーにも i Phone 用の幅480pxページを見せるようになってしまいますか? i Phoneやスマートフォンの対処はどうされているんでしょうか? <?php $agent = $_SERVER['HTTP_USER_AGENT']; if(preg_match("/^DoCoMo/i", $agent)){ header("Location: http://mypage.net/i/index.html"); exit; }else if(preg_match("/^(J\-PHONE|Vodafone|MOT\-[CV]|SoftBank)/i", $agent)){ header("Location: http://mypage.net/s/index.html"); exit; }else if(preg_match("/^KDDI\-/i", $agent) || preg_match("/UP\.Browser/i", $agent)){ header("Location: http://mypage.net/e/index.html"); exit; }else{ header("Location: http://mypage.net/pc/index.html"); exit; } ?>

    • ベストアンサー
    • PHP
  • サイトが移動しました(301)が出てしまいます。

    以下のようにキャリア判別しましたが、ドコモ(f706i) でみるとサイトが移動しました(301)が出ます。 これはなんとかならないんでしょうか? <?php $agent = $_SERVER['HTTP_USER_AGENT']; if(preg_match("/^DoCoMo/i", $agent)){ header("Location: ​http://sample.com/i/index.html");​ exit; }else if(preg_match("/^(J\-PHONE|Vodafone|MOT\-[CV]|SoftBank)/i", $agent)){ header("Location: ​http://sample.com/s/index.html");​ exit; }else if(preg_match("/^KDDI\-/i", $agent) || preg_match("/UP\.Browser/i", $agent)){ header("Location: ​http://sample.com/e/index.html");​ exit; }else{ header("Location: ​http://sample.com/pc/index.html");​ exit; } ?>

    • ベストアンサー
    • PHP
  • 携帯、スマートフォンのPHP振り分け

    こんなPHPを書いているのですが どうしてもParse errorが出ます。 解決方法を教えて下さい!! ■エラー内容 Parse error: syntax error, unexpected T_EXIT in /home/sites/heteml/users/web/m/index.php on line 5 ■振り分けPHP <?php $agent = $_SERVER['HTTP_USER_AGENT']; if(preg_match("/^DoCoMo/i", $agent)){ header("Location: ​http://www.hogehoge.com/m/i/index.html");​ exit; }else if(preg_match("/^(J\-PHONE|Vodafone|MOT\-[CV]|SoftBank)/i", $agent)){ header("Location: ​www.hogehoge.com/m/s/index.html");​ exit; }else if(preg_match("/^KDDI\-/i", $agent) || preg_match("/UP\.Browser/i", $agent)){ header("Location: ​www.hogehoge.com/m/e/index.html");​ exit(); }else if(preg_match("iPhoneやスマートフォン用の判定", $agent)){ header("Location: www.hogehoge.com/m/smt/index.html"); exit(); }else{ header("Location: ​www.hogehoge.com/m/pc/index.html");​ exit(); } ?> よろしくお願い致します。

    • ベストアンサー
    • 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
  • PCと携帯サイトの振分け後の表示アドレスについて

    こんにちは。 私はPHPを利用して、同じアドレス(http://****.com)から携帯とPCを判別して区別しています。 しかし、PCからアクセスした場合は、表示が(http://****.com)となるのですが、携帯からアクセスすると(http://****.com/mobile)のようになってしまいます。 携帯からアクセスした場合でも(http://****.com)と表示させたいのですが、どのようにすればよいのでしょうか。 以前、質問した時は、一つのPHPファイルにPCと携帯二つ分の内容を書いて、どちらかを吐き出す処理を行えばよいとアドバイスをいただきましたが、私の携帯サイトはオリジナルで作成したものではなく、起業からレンタルしているものなのです。 (http://****.com/mobile)というアドレスが与えられるだけのものです。 ですから、自分のオリジナルPCサイトの内容に取り込む事が出来ません。 以下は私の振分けのやり方です。 http://blogn.hustle-user.com/e66.html こちらのサイトを参考にPHPで作成しています。 index.php(http://****.com/でまずここにアクセスします。) <?php $title="http://****.com/mobile"; $page_e='http://****.com/mobile'; $page_j='http://****.com/mobile'; $page_i='http://****.com/mobile'; (↑これら携帯のアドレスにリダイレクトさせてアドレス表示を(http://****.com)にしたいのです。) $i=$_SERVER['HTTP_USER_AGENT'];   $pc='http://****.com/index.html'; (↑PCはこれで上手く(http://****.com)と表示されています。) require_once('data/furiwake.txt'); ?> furiwake.txt(上記のリンク先です) <?php //HDML記述のezweb端末? if (preg_match("/UP\.Browser\/[3-5]/",$i)) { header('Content-Type: text/x-hdml;charset=shift_jis'); echo('<hdml version="3.0" markable="TRUE" public="TRUE">'); echo('<nodisplay markable="TRUE" public="TRUE" title="'.$title.'">'); echo('<action type="ACCEPT" task="GO" dest="'.$page_e.'">'); echo('</nodisplay>'); echo('</hdml>'); exit(); } //SoftBank以前の端末? if (preg_match("/J-PHONE\//",$i)) { header("Location: $page_j"); exit(); } //iモード/EZウェブ次世代機/エアーH"フォンなどの携帯端末一般。 if (preg_match("/DoCoMo\//",$i) || preg_match("/Opera[s\/]/",$i) && !(preg_match("/(Win|Mac|Linux|FreeBSD|OS/2|Solaris)/i",$i)) || preg_match("/UP.Browser/",$i) || preg_match("/^Vodafone/",$i) || preg_match("/^SoftBank/",$i) || preg_match("/^MOT-/",$i) || preg_match("/DDIPOCKET;/",$i) || preg_match("/WILLCOM;/",$i) || preg_match("/L-mode\/\//",$i)) { header("Location: $page_i"); exit(); } else { require_once($pc); exit(); } ?> どなたかPHPに詳しい方、恐れ入りますが回答お願いします。

    • 締切済み
    • PHP
  • PHPとPerlのリダイレクト

    こんにちは。 PHPとPerlのリダイレクトの処理ついて質問です。 PHPのリダイレクトには、exit;を付けないとその後の処理も行ってしまいます。 header("Location:index.php"); exit; Perlのリダイレクトにも、このexit;は必要でしょうか? print "Location:index.cgi\n\n"; exit; ← ? 以上です。 どうぞよろしくお願いします。

    • ベストアンサー
    • Perl
  • ユーザーエージェントの振り分け

    すみません、エージェント振り分けで以下のように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・.htaccess】PCと携帯の振り分けについて

    【PHP・.htaccess】PCと携帯の振り分けについて お世話になります。 PHP・.htaccess共に初心者なのですが、 PCサイトと携帯サイトの振り分けで悩んでいるので宜しくお願い致します。 現在の構成が http://sample.com/ ←トップページ(PHPファイルのみ。各トップへ振り分け) http://sample.com/pc/ ←PCトップページ http://sample.com/mo/ ←モバイルトップページ(.htaccessでIP制限。PCからのアクセスはトップへ) ---------------------------------------------------- 振り分けPHP(http://sample.com/) <?php $agent = $_SERVER['HTTP_USER_AGENT']; if(preg_match("/^DoCoMo/i", $agent)){ header("Location: http://sample/mo/"); exit; }else if(preg_match("/^(J-PHONE|Vodafone|MOT-[CV]|SoftBank)/i", $agent)){ header("Location: http://sample/mo/"); exit; }else if(preg_match("/^KDDI-/i", $agent) || preg_match("/UP.Browser/i", $agent)){ header("Location: http://sample/mo/"); exit; }else{ header("Location: http://sample/pc/"); exit; } ---------------------------------------------------- となって居ますが、都合により http://sample.com/ ←PCトップ モバイルからのアクセスはmoに振り分け。 http://sample.com/mo/ ←モバイルトップページ。(.htaccessでIP制限。PCからのアクセスはトップへ) 上記の形に切り替えたいと思っています、 PHPを使って振り分けをしたいと思っているのですが、 上記の形を再現する事は出来ますでしょうか? また、.htaccessを利用する事により解決が出来るのであれば、 そちらもご教授いただけると幸いです。

    • 締切済み
    • PHP
  • ページの表示と同時にダウンロードさせたい

    いつもお世話になっています。 入力フォームから必要な項目を入力して、送信するとPHPでいろいろ処理して、その後ありがとうページを表示させると同時にファイルのダウンロードをさせたいと考えています。 処理をするPHPでありがとうページを書き出ししても、別なページに飛ばしてもいいのですが、header(Location:~)ではページが表示できず、別なページを作ってHTML表示後にheader(Location:~)だとファイルのダウンロードができずに困っています。 header(Location:~)を使わずにページの表示と同時にファイルのダウンロードが始まるようにできないでしょうか。

    • ベストアンサー
    • PHP

専門家に質問してみよう