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 -->';
}