海外からのアクセスを、PHPのコードを利用して使用するURLを振り分けるようにしたいのですが、うまく動作しません。
- A:sample.com
- B:sample.com/en
2つのURLを用意し、最初のアクセスに利用するドメインは、Aのsample.comのみで、アクセス元やブラウザーの条件によって、A、Bへアクセスが変わるようにしたいです。
どのような、コードに修正すれば良いかご教授いただけないでしょうか?
追記②
オリジナルのサンプルコードに近い形で修正しましたが、こちらでも無限ループのエラーとなります。
$uri = $_SERVER['REQUEST_URI']; $BASE_LANG = 'en'; if (!preg_match('/^[!-~][a-zA-Z]{2}[!-~]/', $uri)) { $languages = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']); $lang = $BASE_LANG; if (isset($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/"; if ($lang == 'ja') { $url = get_site_url(); } header("Location: $url"); exit(); }
追記①
下記にこれまで試したコードを記載していますが、こちらのコード⑤が、最も希望に近い動きになるので、こちらのコードを変更して対応したいと思っています。
下記のようにコードを編集しましたが、ブラウザでアクセスした際にエラーがでます。
This page isn’t working
sample.com redirected you too many times.
Try clearing your cookies.
ERR_TOO_MANY_REDIRECTS
該当のソースコード
functions.phpに追加したコードは以下のとおりです。
// ユーザーの言語に合わせてリダイレクトする。 $uri = $_SERVER['REQUEST_URI']; $url = get_site_url(); //無限ループが起こらないようにするために、/と/en/にマッチしないときのみに以下の処理を行う if ($uri != '/' || $uri != '/en') { $languages = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']); if (isset($languages)) { //languagesが空ではないとき $browser_lamguage = $languages[0]; if ($browser_lamguage != 'ja') { $url = get_site_url()."/en/"; } } header("Location: $url"); exit(); }
コード⑤
参考サイト:ブラウザのロケールを判別してlocaleを含むURLにリダイレクトさせる[PHP]
結果:
日本語設定でアクセス → sample.com/ja/へ、リダイレクト(404エラーとなる)
英語設定でアクセス → sample.com/en/へ、リダイレクト
オリジナルのコード
// ユーザーの言語に合わせてリダイレクトする。 $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(); }
コード①
参考サイト:①日本語と、②日本語以外の、2つの条件で振り分けるPHPのコードを知りたい
結果:
日本語設定でアクセス → A:sample.comで表示される
英語設定でアクセス → B:sample.com/enに、リダイレクトされるが、ブラウザで無限ループのエラーとなる
コード②
参考サイト:海外からのアクセスを振り分ける[php]
結果:
日本語設定でアクセス → A:sample.comで表示される
英語設定でアクセス → B:sample.comで表示される(リダイレクトされない)
コード③
参考サイト:WordPressで多言語サイトを作成し、言語設定によってページをリダイレクトさせる
結果:
日本語設定でアクセス → ブラウザに、[サイトに重大なエラーがありました。]と表示される
英語設定でアクセス → ブラウザに、[サイトに重大なエラーがありました。]と表示される
コード④
参考サイト:【PHP】ブラウザの言語設定ごとに異なるURLにジャンプさせる方法
結果:
日本語設定でアクセス → ブラウザに、[サイトに重大なエラーがありました。]と表示される
英語設定でアクセス → ブラウザに、[サイトに重大なエラーがありました。]と表示される
もともとは、下に紹介している②のコードを改良して利用したく、teratailの他のページで質問でさせてもらっていましたが、改良する前でもうまく動かない事がわかり、今回の新しい質問として出させてもらっています。
②のコードに加えこれまで、以下のコードで試しましたがどれもうまく動作してくれません。
回答1件
あなたの回答
tips
プレビュー