6

基本的な状況と基本的な関連情報:<doctype>開始タグ の前に実行されるphpコードがあります。希望は、(必要に応じて)他のものがロードされる前に、ユーザーのブラウザーの言語設定に基づいてリダイレクトを送信することでした。

スクリプトは、サポートされている最高の言語設定に基づいて2つのことを実行しようとします。

  1. php:setcookie()を使用して、2文字の言語コードでCookieを作成します。
    • Cookie名=値の例:x_language = es
  2. php:header( "Location:"。$ requestedSite);を使用します。サブドメインにリダイレクトするには、
    • ドメインの例:es.domain.com

例:

if (isset($_COOKIE['x_language'])) {
    -Determine correct subdomain based on cookie value-
    -If not currently on that subdomain, redirect to it-
} else {
    setcookie('x_language','es',time() + 31536000 ,'/','.domain.com' );
    header("Location: " . $requestedSite);
}

問題: Firefoxは完全に機能します。Chrome(およびその他のブラウザ)はCookieをまったく認識できません。

私はそれをこれに要約しました:

  • print_r($_COOKIE)Firefoxで正しく動作し、美しい、入力された配列を返します。
  • print_r($_COOKIE)Chromeで失敗し、空の配列を返します。

これが問題の核心です。Chromeが認識しないため、私の関数はCookieの存在を認識しません。

  • すべてのブラウザがCookieを受け入れるようにしました。
  • 私は開発ツールをチェックして、Cookieがすべてのブラウザーに配置されていることを確認しました(そうです)。
  • Cookieの値は、次のページが読み込まれるまで利用できないことに気付きましたが、ここでは問題にはなりません。設定しても読めません。
  • 最初のsetcookie()を超える出力はありません。

では、Chrome(および他のブラウザ)に独自のCookieを認識させるにはどうすればよいですか?!これがFirefoxで問題なく機能するのに、他の場所では失敗する理由を誰かが知っていますか?


ひばりでこれを試してみることにしました。次のものだけを含むファイルを作成しました。

<?php
print_r($_COOKIE);
?>

繰り返しになりますが、FirefoxにCookie配列が表示されます。一方、Chrome、IE、Opera、Safariでは、空の配列が表示されます。これはサーバーの問題でしょうか?

4

2 に答える 2

2

OPは答えを返します:

了解しました。他の誰かがこの(まったく奇妙な)動作に遭遇し、ここに到達した場合に備えて、これを「回答」として追加します。

私のホスティングプロバイダーは、私が気付いていなかった私のWordPressサイトで真剣に積極的なキャッシュを行っていたことがわかりました。

私が質問を投稿したとき、WordPressを使用していることは適切だとは思いませんでしたが、明らかに関連していました。

基本的にそれはこれを行っていました:


クリーンキャッシュの場合:

  • 訪問者1がサイトにアクセスします。
  • phpは期待どおりに出力を処理し、生成します。
  • ビジター1には、(ブラウザーのパラメーターなどに基づいて)php出力が提供されます。

  • 訪問者2がサイトにアクセスします。訪問者2には、 *訪問者1のバージョンのサイトが表示されます。

phpは、Cache-clearごとに1回だけ処理されます。

このキャッシュ動作は、phpを介したCookieへのアクセスが正しく機能しないことを意味しましたが、Javascriptを使用したCookieへのアクセスは機能します。

重要な注意:WordPressにログインしているときにサイトを表示しているすべてのユーザーに対して、上記のキャッシュ動作が無効になっていることがわかりました。これは、WordPress Cacheプラグインの一般的な動作です。そのため、Firefoxでは見たのとは異なる動作が見られました。他のブラウザ。Firefoxで積極的にログインしていたためです。これは、誰かにとって役立つ情報になる可能性があります。)


私の解決策:

Javascriptを使用して、訪問者の言語設定を処理し、出力を2文字のコード(つまり、'en''es''pt''de'など)として返す.phpファイルに対してAJAXクエリを実行します。

AJAXを使用してphpを呼び出すことで、ホストのスーパーアグロキャッシングを回避しながら、ブラウザーの言語設定へのphpのサーバー側アクセスを使用できるようになりました。

これが誰かに役立つことを願っています!そして、これで私を助けようとしたすべての人に感謝します。

于 2013-04-05T18:34:40.653 に答える
0

私は以下のコードでこの問題を抱えていませんでした。に移動してexample.comすぐにリダイレクトされen.example.com、のCookieを確認できました$_COOKIES。使用した場合、試行するたびen.example.com?set=frにリダイレクトされます。これがあなたが探していたものであることを願っています!fr.example.comexample.com

<?php
print_r($_COOKIE);

if(isset($_GET['nuke'])) {
    setcookie('x_language','',time()-1000,'/','.example.com');
    echo 'It has been nuked!';
    exit;
} else if(isset($_GET['set'])) {
    setcookie('x_language',$_GET['set'],time() + 31536000, '/','.example.com');
    $_COOKIE['x_language'] = $_GET['set'];
}

if (isset($_COOKIE['x_language'])) {
    $redirect = $_COOKIE['x_language'].'.example.com';
    if($_SERVER['HTTP_HOST'] != $redirect)
        header('Location: http://'.$redirect);
} else {
    setcookie('x_language','en',time() + 31536000,'/','.example.com');
    $redirect = 'http://en.example.com';
    header('Location: '.$redirect);
}

echo '<br />Cookie: '.$_COOKIE['x_language'].' Domain: '.$_SERVER["HTTP_HOST"];
?>
于 2013-03-10T07:45:00.940 に答える