PHP避免重定向

时间:2014-02-26 11:04:44

标签: php redirect cookies

我想知道是否有可能避免重定向以下问题。

的index.php

$select = new select();

if(!isset($_COOKIE['country']) || !isset($_COOKIE['language'])){
   $select->firstTime();
   $content = $select->clients(); // this will get clients according to the cookies
}

firstTime

public function firstTime(){
    $ip = $_SERVER['REMOTE_ADDR'];
    $xml = simplexml_load_file("http://freegeoip.net/xml/$ip");

    $locale    = $xml->CountryCode;

    $country_f   = "us"; // default
    $locale_f = "en_US"; // default

    /*
        ++ Select country from database according to the locale
        $country_f = $variable_database
    */

    setcookie('language', $locale_f, time() + (60*60*24*365), '/');
    setcookie('country', $country_f, time() + (60*60*24*365), '/');

    header('location: redirect.php');
    exit();
}

redirect.php

header('location: index.php'); exit(); // back to index.php

嗯,问题是:当用户第一次进入页面时它没有cookie,所以我检查他的ip并设置cookie。但是,如果用户没有刷新页面,他将看到默认语言/国家(英语/美国)的页面内容,因此我进行此重定向以强制内容根据用户位置显示。

代码$content = $select->clients(); // this will get clients according to the cookies将根据他的cookie选择客户端。如果我删除redirect代码,客户端将被选为默认的英语/美国,不应该因为cookie已经存储了函数firstTime()。

功能$select->clients()读取 AFTER $select->firstTime(),为什么不检测Cookie?

客户端

list($id_country, $id_language) = $this->get_country_language();
/*
  ... SELECT * FROM clients WHERE id_country = $id_country
*/

get_country_language

public function get_country_language(){
    $id_country = 2; // United States
    $id_language = 1; // English

    if(isset($_COOKIE['country'])){
        $id_country = $this->get_country_from_code($_COOKIE['country']);
    }
    if(isset($_COOKIE['language'])){
        $id_language = $load->get_language_from_code($_COOKIE['language']);
    }       

    return array($id_country, $id_language);
}

我尽力做到最明确。我只是问是否有可能在没有重定向的情况下这样做?因为谷歌说要避免重定向..当我用google pagespeed分析我的页面时,它也会说。

  

您的网页有2个重定向。重定向会引入额外的延迟   在页面加载之前。   mywebsite.com /

     

mywebsite.com/redirect.php

     

mywebsite.com/index.php

3 个答案:

答案 0 :(得分:0)

而不是redirect和exit()为什么不返回数组($ locale_t,$ id language);

答案 1 :(得分:0)

setcookie在用户浏览器上设置cookie信息,但是当前的cookie信息仅在脚本开头加载。

重定向/刷新确实是我相信的唯一方法。

答案 2 :(得分:0)

也许你可以试试这样的事情

public function get_country_language(){
    $id_country = 2; // United States
    $id_language = 1; // English
    $ids = array();

    if(isset($_COOKIE['country']) && isset($_COOKIE['language'])){
        $id_country = $this->get_country_from_code($_COOKIE['country']);
        $id_language = $load->get_language_from_code($_COOKIE['language']);
        $ids = array($id_country, $id_language);
    }       
    else{
        $ids = $this->firstTime();
    }
    return $ids;
    }

public function firstTime(){
    $ip = $_SERVER['REMOTE_ADDR'];
    $xml = simplexml_load_file("http://freegeoip.net/xml/$ip");

    $locale    = $xml->CountryCode;

    $country_f   = "us"; // default
    $locale_f = "en_US"; // default

    /*
    ++ Select country from database according to the locale
    $country_f = $variable_database
    */

    setcookie('language', $locale_f, time() + (60*60*24*365), '/');
    setcookie('country', $country_f, time() + (60*60*24*365), '/');

    return array($country_f, $locale_f);
    }

...之后你可以解析内容。