Joomla!,Wordpressでサイトを構築するためのヒント

qTranslateでループエラー-が発生(Wordpress 3.0)

公開日| 2010年07月23日 | 1つのコメントがあります。

WordPress3.0がリリースされ、時間的にも、随分、プラグインの対応が進みました。
そこで、Wordpress3.0へアップデート!!としたいところですが、実際に、いろいろと試してみると、うまくいかないことも多いです。

その中で、今回は、qTranslateでCookiesを使用不可にすると、リダイレクトのループが発生し、表示できない問題の対処をやってみました。
同じ問題で苦しんでおられる方のヒントになれば幸いです。

症状

ホームページへアクセスしたとき、以下のような画面が表示されることがあります。


これは、ブラウザの設定が、Cookiesと使わないようになっていて、qTransrateの設定が以下のようになっている場合に発生するようです。

Checked – Detect the language of the browser and redirect accordingly.
Unchecked Hide URL language information for default language.


このことから、例えば、ブラウザの設定が、Cookiesを使うようになっていた場合、特に問題は、発生しないようです。

原因

上記のことからも分かるように、例えば、日本語がデフォルト言語とした場合、単純に以下のURLへリダイレクトしようとしているみたいです。

http://wwww.example.com/

          |
          V

http://wwww.example.com/ja

          |
          V

http://wwww.example.com/

上記からもわかるように完全にループしてますね。
これを回避するためにCookiesが使われてるみたいな感じがしますね。(全コードを追っていないの本当のところはわかりません。

対処

qtranslate_core.phpの以下の処理が、直接の原因のようです。

86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
	// detect language and forward if needed
	if($q_config['detect_browser_language'] && $q_config['url_info']['redirect'] && !isset($_COOKIE['qtrans_cookie_test']) && $q_config['url_info']['language'] == $q_config['default_language']) {
		$prefered_languages = array();
		if(isset($_SERVER["HTTP_ACCEPT_LANGUAGE"]) && preg_match_all("#([^;,]+)(;[^,0-9]*([0-9\.]+)[^,]*)?#i",$_SERVER["HTTP_ACCEPT_LANGUAGE"], $matches, PREG_SET_ORDER)) {
			$priority = 1.0;
			foreach($matches as $match) {
				if(!isset($match[3])) {
					$pr = $priority;
					$priority -= 0.001;
				} else {
					$pr = floatval($match[3]);
				}
				$prefered_languages[$match[1]] = $pr;
			}
			arsort($prefered_languages, SORT_NUMERIC);
			foreach($prefered_languages as $language => $priority) {
				if(qtrans_isEnabled($language)) {
					if($q_config['hide_default_language'] && $language == $q_config['default_language']) break;
					$target = qtrans_convertURL(get_option('home'),$language);
					header("Location: ".$target);
					exit;
				}
			}
		}
	}

87行目の条件が、そのまま、症状で設定している条件と同じになります。

!isset($_COOKIE[‘qtrans_cookie_test’])
= ブラウザのCookie拒否の設定を意味します。

$q_config[‘detect_browser_language’]
= ■ Checked – Detect the language of the browser and redirect accordingly.
を意味します。

$q_config[‘url_info’][‘redirect’]
= □ Unchecked Hide URL language information for default language.
を意味します。

ここでの問題は、現在のリクエストURLとリダイレクトしようとするURL(105行目の$target)が同じかどうかのチェックをしていないところだろうと思います。

では、簡単にチェックを入れてみましょう。

86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
	// detect language and forward if needed
	if($q_config['detect_browser_language'] && $q_config['url_info']['redirect'] && !isset($_COOKIE['qtrans_cookie_test']) && $q_config['url_info']['language'] == $q_config['default_language']) {
		$prefered_languages = array();
		if(isset($_SERVER["HTTP_ACCEPT_LANGUAGE"]) && preg_match_all("#([^;,]+)(;[^,0-9]*([0-9\.]+)[^,]*)?#i",$_SERVER["HTTP_ACCEPT_LANGUAGE"], $matches, PREG_SET_ORDER)) {
			$priority = 1.0;
			foreach($matches as $match) {
				if(!isset($match[3])) {
					$pr = $priority;
					$priority -= 0.001;
				} else {
					$pr = floatval($match[3]);
				}
				$prefered_languages[$match[1]] = $pr;
			}
			arsort($prefered_languages, SORT_NUMERIC);
			foreach($prefered_languages as $language => $priority) {
				if(qtrans_isEnabled($language)) {
					if($q_config['hide_default_language'] && $language == $q_config['default_language']) break;
					$target = qtrans_convertURL(get_option('home'),$language);
 
$http = $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$npos = strpos($target,'//');
if($npos!==false) {
	$target_chk = substr($target,$npos+2);
} else {
	$target_chk = $target;
}
if($target_chk == $http) break;
 
					header("Location: ".$target);
					exit;
				}
			}
		}
	}

105 – 114 行目までを追加してみました。

単純に現在のURLとリダイレクトのURLが同じなら、リダイレクト処理をしないようにしています。

実際に動作させて見るとうまくいきました。

もちろん、ソースコードの変更などしたくない方は、

Checked – Detect the language of the browser and redirect accordingly.
Unchecked Hide URL language information for default language.

のいずれかを反転させれば良いはずですので、お困りの方は、試されてみるのも良いかもしれません。






コメント

One Response to “qTranslateでループエラー-が発生(WordPress 3.0)”

  1. Adam
    2011年10月07日 @ 23:04:40

    Hi,
    Thank you for your post – I’m surprised to be first to say thank you.

    I’m using qTranslate in version 2.5.24 and there is slight difference in the code of qtranslate_core.php.

    Basically the Redirect itself (and exit) is done after the loop so break does not work anymore to prevent redirect. Simple fix is to introduce a flag (I call it $redirect_corrupt), which is risen once the faulty redirect is detected by your code. Then the flag is being checked when redirect is about to be applied.

    Cheers & thanks,
    Adam

コメントをどうぞ








翻訳

最近の記事

カテゴリー

タグクラウド

execute remove フロントページ 投稿ページ トップページ install WIndows Note Convert META generator 日付 donwload file manage multibyte utf-8 unicode shiftjis euc console サイトマップ 問題 ParmaLink Redirect パーマリンク はみ出る pre テンプレート テーマ タグクラウド マルチランゲージ リダイレクト PHP(タグ) タグ table control HTML(タグ) コマンド 国際化(翻訳) SQLite(タグ) MySQL(タグ) qTranslate プラグイン(タグ) Wordpress(タグ)

リンク

このサイトは?

Joomla!,WordpressなどCMSを使ったサイト構築、サイト管理からソフトウェアの使用方法、開発環境までのヒントを記述します。

  • はてなブックマークへ追加する
  • Facebookでシェアする
  • twitter でつぶやく
  • Google Plusでシェアする
  • Pocketでシェアする
ページトップへ