ブラウザのロケールを判別してlocaleを含むURLにリダイレクトさせる[PHP]

wordpressなどのサイトに海外からのアクセスがあった際にブラウザのロケールを判別することにより、海外の人向けのurlをリダイレクトする方法です。 javaScriptや.htaccessなどを利用することでも、リダイレクトを行うことができますが、今回はphpを用い、リダイレクトを行います。 phpには「HTTP_ACCEPT_LANGUAGE」という環境変数が用意されています。 この環境変数を利用することで、ブラウザに設定されている言語を取得することができます。

$languages = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
//実行結果
Array
(
    [0] => ja
    [1] => en-US;q=0.9
    [2] => en;q=0.8
)

上記を見てもらえればわかると思いますが、ブラウザに設定されている言語は一つとは限りません。 ですので、今回はブラウザで優先度がより高く設定されている言語を判別することにします。 ブラウザで優先がより高い言語は一番上になっているものであるため、今回は”ja”、日本語が取得されることになります。

今回作成しているサイトは海外の人向けのサイトになるため、ベースとなる言語を英語の”en”としてあります。

また、urlのリダイレクトによる無限ループを防ぐために、preg_match()関数による正規表現を用い、/○○/に一度合致したら、リダイレクト処理を行わないように以下のように変更しました。 (/○○/の○○はjaやenのような英字二文字が入ります。)

今回完成したコードはこちらです。

<?php
    // ユーザーの言語に合わせてリダイレクトする。
    $uri = $_SERVER["REQUEST_URI"];
    $BASE_LANG = "en";
    //無限ループが起こらないようにするために、/ja/や/en/にマッチしないときのみに以下の処理を行う
    if(!preg_match("/^[!-~][a-zA-Z]{2}[!-~]/",$uri)){
      $languages = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
      $lang = $BASE_LANG;
      if(isset($languages)){ //languagesが空ではないとき
        $browser_lamguage = $languages[0];
        $base_languages = array('ja','en');

        foreach($base_languages as $base_language){
          if(preg_match("/^$base_language/i", $browser_lamguage)){
            $lang = $base_language;
            break;
          }
        }
      }
      $url = get_site_url()."/$lang/";
      header("Location: $url");
      exit();
    }
?>

参考サイト 海外からのアクセスを振り分ける[php]