-1

目的

ユーザーの言語に応じて自動リダイレクトを実現しようとしています。私はそのための完全に機能するコードを持っています:

// List of available localized versions as 'lang code' => 'url' map
$sites = array(
    "da" => "http://www.fredrixdesign.com/",
    "en" => "http://en.fredrixdesign.com/"
);

// Get 2 char lang code
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);

// Set default language if a `$lang` version of site is not available
if (!in_array($lang, array_keys($sites)))
    $lang = 'en';

// Finally redirect to desired location
header('Location: ' . $sites[$lang]);
?>

これにより、ユーザーがデンマーク人の場合、メイン/ルート Web サイトであるデンマーク語 (da) バージョンにユーザーがリダイレクトされます。ユーザーがドイツ語、英語、ポーランド語などの場合、ユーザーをサブドメインにリダイレクトします。en.fredrixdesign.com、これはウェブサイトの英語版です。

しかし、デンマークのユーザーが私のサイトにアクセスすると、問題が発生します。私のheader.phpの上部にあるコードは実行され続けます。つまり、リダイレクトを作成し続け、最終的にリダイレクトが多すぎるためにブラウザーにエラーを作成させます. これは理にかなっています。

質問

私の質問は次のとおりです。上記のコードを変更して、リダイレクトを 1 回だけ実行するにはどうすればよいでしょうか。リダイレクトが完了したばかりの場合は、そのままサイトの実行を続行します。

4

4 に答える 4

2

まあ、ちょっと考えれば自分で解決できると思います。必要なのは、現在のドメインが目的の言語を満たしているかどうかを確認することだけです。
配列を少し修正するだけです

$sites = array(
    "da" => "www.fredrixdesign.com",
    "en" => "en.fredrixdesign.com"
);

次に、リダイレクトの条件を追加します

if ($sites[$lang] != $_SERVER['HTTP_HOST']) {
    header('Location: http://' . $sites[$lang] . '/');
    exit;
}

それで全部です

于 2012-05-05T09:51:25.920 に答える
0

ユーザーを言語固有のサイトに自動的にリダイレクトしたことを示すCookie値を設定できます。そのCookieが存在する場合は、リダイレクトを再度実行しないでください。また、ユーザーがCookieを無効にしている場合を検討することもできます。

于 2012-05-05T09:05:02.867 に答える
0

これはGeoIP+.htaccessで行うことができ、実装は非常に簡単です。

http://www.maxmind.com/app/mod_geoip

于 2012-05-05T09:09:08.023 に答える
0

このようなものでうまくいく可能性があります(もちろん、非常に優れた解決策はたくさんありますが、2つの言語では、簡単なことをして後で必要に応じて改善しても害はありません):

function redirectIfUserIsNotOnTheGoodURLBasedOnHisLanguage()
{
    // List of available localized versions as 'lang code' => 'url' map
    $sites = array(
        "da" => "http://www.fredrixdesign.com/",
        "en" => "http://en.fredrixdesign.com/"
    );

    // Get 2 char lang code
    $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);

    // Set default language if a `$lang` version of site is not available
    if (!in_array($lang, array_keys($sites)))
        $lang = 'en';

    if (($lang == 'da' && $_SERVER['SERVER_NAME'] == 'www.fredrixdesign.com') ||    // Danish people are on the right place
        ($lang == 'en' && $_SERVER['SERVER_NAME'] == 'en.fredrixdesign.com'))       // Other people are on the right place
    {
        // no redirection
        return;
    }

    // else redirect to desired location
    header('Location: ' . $sites[$lang]);
    exit(0);
}

redirectIfUserIsNotOnTheGoodURLBasedOnHisLanguage();
于 2012-05-05T09:37:38.343 に答える