質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

509閲覧

アクセスを判別してリダイレクトさせずに日本語ページを表示したい

amanoyuku

総合スコア11

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/09/07 05:45

編集2017/09/08 01:46

・前提
日本語と英語の二言語サイトを作成しています。
ブラウザの言語設定をHTTP_ACCEPT_LANGUAGEで判別して
それぞれのページへリダイレクトをかけて表示するようにしています。

・実現したいこと
ページ内にも言語選択のボタンを設置しており
英語ページからアクセスしたときのみ、
リダイレクトさせずに日本語ページを表示できるようにしたいです。

$_GETを利用してif文を追加すればいいらしいということはわかったのですが
PHP初心者のため記述方法がわかりません。。
ご教授願えますと幸いです。
よろしくお願い致します。

php

1$languages = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']); 2$languages = array_reverse($languages); 3 4$result = ''; 5 6foreach ($languages as $language) { 7 if (preg_match('/^en/i', $language)) { 8 $result = 'English'; 9 header("Location: /en"); 10 } elseif (preg_match('/^ja/i', $language)) { 11 $result = 'Japanese'; 12 header("Location: "); 13 } 14} 15if ($result == '') { 16 $result = 'Japanese'; 17 header("Location: ");

・追記
http://kotori-blog.com/php/globalaccess/
こちらの方のブログを参考にしました。
ページ下部「海外用ページから日本語ページにアクセスした時を判別する」の箇所です。
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2017/09/08 01:34

「$_GETを利用してif文を追加すればいいらしい」というのは何か参考にしたのでしょうか?参考先URLや書籍の情報を質問に追記してください。
amanoyuku

2017/09/08 01:46

ご返信ありがとうございます。質問に追記しました。よろしくお願いいたします。
guest

回答1

0

ベストアンサー

・実現したいこと

ページ内にも言語選択のボタンを設置しており
英語ページからアクセスしたときのみ、
リダイレクトさせずに日本語ページを表示できるようにしたいです。

下記の認識で話を進めます。違ってたらすみません。

英語ページ内で「日本語」を選択した時にそのまま日本語ページにアクセスしたい。(自動リダイレクト無効) → 上記工程で一度日本語ページに入ったら、その後すべてのリンクも日本語ページにアクセスする

プログラムコードだと$_SERVER['HTTP_ACCEPT_LANGUAGE']しか判断基準がないので、何かしらの上書きロジックが必要となります。URLのGETクエリストリングでもいいですが、すべてのページで引き回さなければならないので、Cookieを参照するようにして設定値を引き回します。

Cookie+JavaScript

$languages配列が空なら自動的にリダイレクトしないので、リンクにあるとおりのURLに遷移します。したがって、Cookieが設定されていれば、日本語・英語の指定を手動で行ったことになるので配列を空にします。

php

1//$_COOKIE['Lang']取得 2$cookie = filter_input(INPUT_COOKIE, 'Lang', FILTER_SANITIZE_FULL_SPECIAL_CHARS); 3$cookie = $cookie == 'ja' ? 'ja' : ($cookie == 'en' ? 'en' : null); 4 5$languages = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']); 6$languages = empty($cookie) ? array_reverse($languages) : []; 7 8$result = ''; 9 10foreach ($languages as $language) { 11 if (preg_match('/^en/i', $language)) { 12 $result = 'English'; 13 header("Location: /en"); 14 } elseif (preg_match('/^ja/i', $language)) { 15 $result = 'Japanese'; 16 header("Location: "); 17 } 18}

日本語・英語の選択がセレクトボックスの場合は下記のように書きます。jqueryとjs-cookieを使っています。js-cookieはjquery.cookieの後継です。
https://github.com/js-cookie/js-cookie

js

1//Cookie保存 2$(日本語|英語).on('change', function (e) { 3 var lang = $(e.target).val(); 4 Cookies.set('Lang', lang , {path: '/'}); 5});

日本語・英語の選択がセレクトボックスではなく、Aリンクの場合は下記のように書きます。

js

1//Cookie保存 2$(日本語|英語).on('click', function (e) { 3 e.preventDefault(); 4 var lang = $(e.target).attr('href').indexOf('/en') >= 0 ? 'en' : 'ja'; 5 Cookies.set('Lang', lang , {path: '/'}); 6});

GET+Cookie

言語選択時のCookie保存をJavaScript側に書きましたが、どうしてもPHP側で処理したい場合は、言語選択時のリクエストURLにクエリストリングを追加します。(GETパラメーター)

html

1<a href="/ja/xxx?lang=ja">日本語</a> 2<a href="/en/xxx?lang=en">English</a>

そして、PHP側でクエリストリングを取得してCookieに保存しておきます。クエリストリングまたは、Cookieが設定されていれば、日本語・英語の指定を手動で行ったことになるので配列を空にします。

php

1//$_GET['lang']取得 2$query = filter_input(INPUT_GET, 'lang', FILTER_SANITIZE_FULL_SPECIAL_CHARS); 3 4//Cookieに保存 5if (! empty($query) && ($query == 'ja' || $query == 'en')) { 6 setcookie('Lang', $query, 0, '/'); 7} 8 9//$_COOKIE['Lang']取得 10$cookie = filter_input(INPUT_COOKIE, 'Lang', FILTER_SANITIZE_FULL_SPECIAL_CHARS); 11$cookie = $cookie == 'ja' ? 'ja' : ($cookie == 'en' ? 'en' : null); 12 13$languages = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']); 14$languages = empty($cookie) && empty($query) ? array_reverse($languages) : []; 15 16$result = ''; 17 18foreach ($languages as $language) { 19 if (preg_match('/^en/i', $language)) { 20 $result = 'English'; 21 header("Location: /en"); 22 } elseif (preg_match('/^ja/i', $language)) { 23 $result = 'Japanese'; 24 header("Location: "); 25 } 26}

投稿2017/09/12 23:01

Tomak

総合スコア1652

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amanoyuku

2017/09/13 02:24

実現できました!!! 本当に本当にありがとうございました!!
amanoyuku

2017/10/11 06:57

IEでのみ、「このページは表示できません」と表示され、サイトが表示されません。 何か原因がわかりましたら教えていただけないでしょうか。 何卒よろしくお願い致します。
amanoyuku

2017/10/11 08:19

申し訳ありません!上記自己解決しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問