PHP выполняет дважды при загрузке страницы при перенаправлении с не-www на www

Я создал скрипт php для контроля времени всплывающего окна. Я хочу, чтобы всплывающее окно отображалось один раз в 60 секунд. Сценарий устанавливает файл cookie при первом посещении страницы пользователем, а затем при последующих посещениях сценарий проверяет файл cookie и активирует всплывающее окно только в том случае, если срок действия файла cookie истек. Всплывающее окно управляется переменной $_SESSION['activ_popup'].

Сценарии работают так, как задумано, во всех случаях, кроме случаев, когда пользователь впервые заходит на страницу. Файл cookie пуст, поэтому он должен установить файл cookie и активировать всплывающее окно в условии 1. Вместо этого он устанавливает файл cookie в условии 1 и отображает вывод в условии 2.

$GLOBALS['popup_output'] .= '<!-- begin popup -->';
$domain = 'brocktonvilla.com';
$expiration = time() + 60;
$time_until_expires = $_COOKIE['rc_popuup2'] - time();
$GLOBALS['popup_output'] .= '<!-- time until expires: ' . $time_until_expires . ' sec -->';

/* 1 */     if ( empty($_COOKIE['rc_popuup2']) ) {                                      // if cookie has not been set
                setcookie('rc_popuup2', $expiration, $expiration, '/', $domain );       // set cookie with value of cookie equals expiration time
                $_SESSION['activate_popup'] = 'yes';                                    // activate the popup
                $GLOBALS['popup_output'] .= '<!-- cookie empty => show popup & set cookie -->';             
            }       
/* 2 */     elseif ( $_COOKIE['rc_popuup2'] > time() ) {                                // cookie has been set and cookie expiration is greater than current time
                $_SESSION['activate_popup'] = 'no';                                     // do not activate popup
                $GLOBALS['popup_output'] .= '<!-- cookie set and not expired => do not show popup -->';
            }
/* 3 */     elseif ( $_COOKIE['rc_popuup2'] < time() ) {                                // cookie has been set and cookie expiration is less than current time
                $_SESSION['activate_popup'] = 'yes';                                    // activate the popup
                setcookie('rc_popuup2', $expiration, $expiration, '/', $domain );       // reset cookie with value of cookie equals expiration time
                $GLOBALS['popup_output'] .= '<!-- cookie set but has expired => show popup & reset cookie -->';
            }

Вы можете увидеть сценарий в действии здесь http://www.brocktonvilla.com/. Поищите в исходном коде "начало всплывающего окна", и вы увидите, что файл cookie был установлен в условии 1 и отображает вывод в условии 2 при первом посещении страницы.

2 ответа

Оказывается, что описанная выше проблема вызвана тем, что PHP выполняется дважды: один раз, когда пользователь впервые посещает версию страницы без www, а затем снова при перенаправлении на версию www.

Казалось, что сценарий (невозможно) выполнял операторы if и else, но вместо этого происходило то, что на первом проходе cookie не был установлен, и поэтому он устанавливал cookie (условие 1), а затем на втором проходе он прочитал, что cookie уже был установлен и не истек (условие 2). Это объясняет, почему сценарий выводит, что между установкой cookie и созданием вывода прошло 1-3 секунды, как видно из моего комментария к попытке решения, предоставленной пользователем Relentless.

Чтобы ваш скрипт php не запускался дважды, просто оберните его следующим:

$domain = $_SERVER['SERVER_NAME'];                                                      
$needle = 'www.';
$pos = strpos($domain, $needle);
if( $pos !== false ) { 
        // your script here     
}       

Этот скрипт предполагает, что вы перенаправляете все запросы сервера для http://domain.com/ на http://www.domain.com/. Если вместо этого вы перенаправляете на не-www, удалите восклицательный знак из условия ($pos!== false).

Попробуй это:

$completed = false;
/* 1 */     if ( empty($_COOKIE['rc_popuup2']) ) {                                      // if cookie has not been set
                setcookie('rc_popuup2', $expiration, $expiration, '/', $domain );       // set cookie with value of cookie equals expiration time
                $_SESSION['activate_popup'] = 'yes';                                    // activate the popup
                $GLOBALS['popup_output'] .= '<!-- cookie empty => show popup & set cookie -->';             
            $completed = true;
            }       
/* 2 */     elseif (( $_COOKIE['rc_popuup2'] > time() ) && ($completed == false)) {                                // cookie has been set and cookie expiration is greater than current time
                $_SESSION['activate_popup'] = 'no';                                     // do not activate popup
                $GLOBALS['popup_output'] .= '<!-- cookie set and not expired => do not show popup -->';
             $completed = true;
            }
/* 3 */     elseif (( $_COOKIE['rc_popuup2'] < time() )  && ($completed == false)) {                                // cookie has been set and cookie expiration is less than current time
                $_SESSION['activate_popup'] = 'yes';                                    // activate the popup
                setcookie('rc_popuup2', $expiration, $expiration, '/', $domain );       // reset cookie with value of cookie equals expiration time
                $GLOBALS['popup_output'] .= '<!-- cookie set but has expired => show popup & reset cookie -->';
            }
Другие вопросы по тегам