PHPを学ぼう!

▼PHPを学ぶチャプターです。


PHPプログラマ 緊急募集!

 

素材メニュー

 ◆Chapter 1

 ◆Chapter 2

 ◆Chapter 3

 ◆Chapter 4

 

制作ヒント

 ◆制作のヒント

 

レッスンメニュー

 ◆Chapter2 練習問題

 ◆Chapter3 DB練習問題

 

サイト運営者がPHPを学んだ
お勧めの書籍です!
これ一冊で基本的なPHPの仕組み、簡単なプログラムの作成、SQLiteを使ったデータベースなどかなり学べる要素が詰まっています!

↓↓↓ ↓↓↓

PHPレッスンブック―PHP5対応

新品価格
¥2,520から
(2013/2/24 04:38時点)

 

 

サイバーテロの技法について書かれた書籍です!
ハッカーの手法を知ることでご自身のサイトがハッカーに攻撃されたときそれを防ぐ手法を紹介しています。

↓↓↓ ↓↓↓

PHPサイバーテロの技法―攻撃と防御の実際

新品価格
¥1,890から
(2013/11/5 10:09時点)

 

 

★初年度100円! サブドメインやメールアカウントを無制限に設置できます。
PHPやCGIは勿論、WordPress、Movable Type Open Source、掲示板、ブログ、ショッピングサイトなどが簡単に導入できるので複数サイトを運営したい場合に便利なサービスです。

↓↓↓ ↓↓↓

 

PHPが動作するサーバー

 

はじめてのHP | 無料素材 | タグ辞典 | CSSガイドEX | PHPを学ぼう!

◆Chapter 4 - 海外からのアクセスをブラウザ言語で振分ける

ブラウザの言語は通常、日本人なら日本語、アメリカやイギリスなど英語圏の人なら英語に設定されています。
複数の言語が設定されることもありますが、優先順位から主に使用している言語を知ることができます。
これを利用しページを振り分ける処理を PHP プログラムで作りました。

ブラウザの言語の設定方法や言語対応表については、『 Tip22 - ブラウザ言語の設定及び対応表 』を参照ください。

  

ブラウザの言語を任意で変更していた場合には、設定している言語が優先されます。
例えば、日本に住む外国人がブラウザの言語を英語と設定していた場合や日本に住む日本人が言語を英語に設定していた場合にはイレギュラーになります。
ブラウザの言語の設定によって挙動が変ることになります。

  

ちなみに「 IP 」アドレスや「 .htaccess 」 、「 JavaScript 」を利用す方法もありますが、これらも完璧に振分けることはできません。
「 PHPを学ぼう! 」は PHP プログラムを学ぶサイトなので PHP プログラムで分割する方法を紹介します。

  

  

プログラムは、次のディレクトリの構成を想定した仕様となっています。

    【 public_html 】
      ├ index.php (日本語のページ)
      ├ page1.php (日本語のページ)
      ├ page2.php (日本語のページ)
      ├ page3.php (日本語のページ)
      ├ Oversea_CHK.php
      └ en(英語のページ)
         ├ index.php
         ├ page1.php
         ├ page2.php
         └ page3.php

  

  

ディレクトリ構成を見て「 おや? 」と思った人もいるでしょう。
そう、このプログラムは外国語は全て英語として想定しているのです。
「 いやいや、必要だよ。 」という方は、ソースコードを修正して必要な言語を追加してください。
修正をする場合、 header 関数でリダイレクトに注意してください。
修正を誤ると無限ループに陥ります。必ずローカルで動作確認をしてから公開しましょう!

  

  

プログラムの主な仕様は次の通りです。

◆ブラウザ言語が日本語で日本語のページにアクセスした場合、

  • 日本語のページを表示します
  • パラメーターが付加されていない場合、日本語ページを表示します
  • パラメーターに " lang=en " を付加された場合、英語のトップページ( index.php )に遷移します
  • パラメーターに " lang=en " 以外を付加した場合、日本語のページを表示します

  

◆ブラウザ言語が英語で英語のページにアクセスした場合、

  • 英語のページを表示します
  • パラメーターが付加されていない場合、英語のページを表示します
  • パラメーターに " lang=ja " を付加された場合、日本語のトップページ( index.php )に遷移します
  • パラメーターに " lang=en " 以外を付加した場合、英語のページを表示します

  

◆ブラウザ言語が日本語または英語でない場合、

  • 英語のページを表示します
  • パラメーターが付加されていない場合、英語のページを表示します
  • パラメーターに " lang=ja " を付加された場合、日本語のトップページ( index.php )に遷移します
  • パラメーターに " lang=en " 以外を付加した場合、英語のページを表示します

  

  

プログラムの動作には、PHP ライブラリの GD が使えることが前提となります。
サーバーの GD で " Support " が " enabled " かどうかは、

phpinfo();

などで確認してください。

アクセスしてきた端末を振分ける PHP プログラムと併用する場合には、『 アクセス端末別に振り分ける 』を参考にしてください。

  

  

【Oversea_CHK.php】

001<?php
002  ##################################################
003  # 海外からのアクセスを振分ける
004  ##################################################
005  //ブラウザで使用中の言語を確認
006  function Languages_CHk($swicth){
007    $lang = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
008    if($swicth==1){
009      //ブラウザ言語の確認
010      $result = $lang;
011    }else{
012      if(preg_match('/^en/i', $lang)){
013        //英語(全て)
014        $result = 'en';
015      }elseif(preg_match('/^ja/i', $lang)){
016        //日本語
017        $result = 'ja';
018      }else{
019        //判定不能、あるいは未設定の場合
020        $result = substr($lang, 0, 2);
021      }
022    }
023    return $result;
024  }
025
026
027
028  #アクセスしてきたブラウザが国外なら対応するページに遷移する
029  function Lang_JA_CHK($dir1, $dir2, $lang_set, $swicth){
030    $bslang = Languages_CHk(0);
031    $lang_get = isset($_GET["lang"]) ? $_GET["lang"] : "" ;
032
033    if($swicth==1){
034      //ブラウザ言語が日本語の処理
035      if($bslang == "ja" && $lang_set == "ja"){
036        //"lang=en" のパラメーターが付加されていた場合
037        if($lang_get == "en" ){
038          header("Location: {$dir2}en/index.php?lang=en");
039          exit();
040        }
041      }else{
042          //ブラウザ言語がその他の言語の処理
043          if($bslang != "ja" && $lang_set == "ja"){
044            if($lang_get != "ja" ){
045              header("Location: {$dir2}en/index.php?lang=en");
046              exit();
047            }
048          }
049      }
050    }
051  }
052
053
054
055  function Lang_EN_CHK($dir1, $dir2, $lang_set, $swicth){
056    $bslang = Languages_CHk(0);
057    $lang_get = isset($_GET["lang"]) ? $_GET["lang"] : "" ;
058
059    if($swicth==1){
060      //ブラウザ言語が日本語の処理
061      if($bslang == "ja" && $lang_set == "en"){
062        //"lang=en" のパラメーターが付加されていた場合
063        if($lang_get != "en" ){
064          header("Location: {$dir1}index.php");
065          exit();
066        }
067      }else{
068        //ブラウザ言語がその他の言語の処理
069        if($bslang != "ja" && $lang_set == "en"){
070          if($lang_get == "ja"){
071            header("Location: {$dir1}index.php?lang=ja");
072            exit();
073          }
074          if($lang_get != "en" ){
075            header("Location: {$dir2}index.php?lang=en");
076            exit();
077          }
078        }
079      }
080    }
081  }
082?>

  

Languages_CHK は、ブラウザの言語を特定する為のカスタマイズ関数です。

次のグローバル変数を利用することでブラウザで使用している言語を知ることができます。

$_SERVER['HTTP_ACCEPT_LANGUAGE']

引数に " 1 " 入れるとブラウザ言語に設定されている値を返します。

Languages_CHk(1);

複数の言語が設定されている場合には、次のような値を返します。

ko,ja;q=0.8,en-US;q=0.6,fr;q=0.4,en;q=0.2

ブラウザ言語は優先的度の高い順に値を返され、この場合では韓国語、日本語、英語(アメリカ)、フランス語、英語の順になります。
引数に " 1 " 以外の数字か文字を入れることでブラウザの言語の特定ができます。
ただし、先頭の言語のみをマッチングあるいは切り出しているので一番高い優先度の言語をのみの対応となります。

  

  

Lang_JA_CHK は、日本語ページ用のカスタマイズ関数です。
ブラウザ言語、ページの言語、パラメーターから判断しリダイレクトさせます。
第 4 引数に " 1 " 入れるとブラウザ言語に設定されている値を返し、それ以外の数字か文字を入れると振分け処理はしません。

  

Lang_EN_CHK は、日本語以外用のカスタマイズ関数です。
ブラウザ言語、ページの言語、パラメーターから判断しリダイレクトさせます。
第 4 引数に " 1 " 入れるとブラウザ言語に設定されている値を返し、それ以外の数字か文字を入れると振分け処理はしません。

Lang_JA_CHK と Lang_EN_CHK を 1 つのカスタマイズ関数にしてもよかったのですが、振り分けが混乱してしまうので分けて作りました(^~^;

  

リダイレクトの判定には、『 アクセス端末別にページを振り分ける 』でも紹介したように 3 つの要素で判定します。

  • ページの言語
  • ブラウザの言語
  • パラメーター値

  

各ページにはページの言語を設定します。
日本語のページには次のように設定します。

<?php
  include_once("./Oversea_CHK.php");

    //対応ページ
    $lang = "ja";

    //アクセス端末別にページ遷移
    Lang_JA_CHK("./", "./", $lang, 1);
?>
<html lang="ja">
  .
  .
  .

英語のページには次のように設定します。

<?php
  include_once("../Oversea_CHK.php");

    //対応ページ
    $lang = "en";

    //アクセス端末別にページ遷移
    Lang_en_CHK("../", "./", $lang, 1);
?>
<html lang="en">
  .
  .
  .

どちらも第 1 引数には日本語、第 2 引数には英語のページの相対パスを入れます。
{ Lang_JA_CHK の第 1 引数はいらないのでは? 」
と思うかもしれませんが、修正や追加する見込みがありますので残しています・・・。

  

[2017年8月9日 公開]

  

  

一括ダウンロード

 

 

 

 

 

 

 

 

 

 

 

 

ex-mode.net | ツールEX | 素材EX | アフィモール | 初級者向 初めてのホームページ作り | Htmlタグ辞典 | 初めてのプランター菜園 | リンク・ボード
気のみ気のままなブログ | CSSガイドEX | ホビ★コレ | 班長日記!

▲UP

Copyright (C) ex-mode.net 2017. All Rights Reserved.