Как я могу установить файл cookie, а затем перенаправить его в PHP?


После небольшой обработки я хочу установить значение файла cookie для ввода пользователем, а затем перенаправить их на новую страницу. Однако файл cookie не устанавливается. Если я закомментирую перенаправление, то файл cookie будет успешно установлен. Я предполагаю, что это какая-то проблема с заголовком. Каков наилучший обходной путь в этой ситуации?

if($form_submitted) {
    ...
    setcookie('type_id', $new_type_id, time() + 60*60*24*30);
    header("Location: $url");
    exit;
}

Обратите внимание, что setcookie возвращает true в любом случае, и я не получаю ошибок/предупреждений/уведомлений.

РЕДАКТИРОВАТЬ: Я использую Unix/Apache/MySQL/PHP

Author: bignose, 2009-03-04

5 answers

Если у вас есть человеческие URL-адреса или вложенные папки (например www.domain.com/path1/path2 /), затем вы должны установить путь к файлу cookie в /, чтобы он работал для всех путей, а не только для текущего.

if($form_submitted) {
    ...
    setcookie('type_id', $new_type_id, time() + 60*60*24*30, '/');
    header("Location: $url");
    exit;
}

Из руководства по PHP:

Путь на сервере, на котором будет доступен файл cookie. Если установлено значение "/", файл cookie будет доступен во всем домене. Если установлено значение "/foo/", файл cookie будет доступен только в каталоге /foo/ и во всех подкаталогах, таких как /foo/bar/ из домен. Значением по умолчанию является текущий каталог, в котором устанавливается файл cookie.

 70
Author: Glavić, 2013-08-14 11:30:33

Я предполагаю, что вы используете IIS? Существует известная ошибка с версиями IIS менее 7 при попытке установить файл cookie и заголовок местоположения в одном запросе.

Http://support.microsoft.com/kb/q176113/

 4
Author: Daniel Von Fange, 2009-03-04 19:34:27

Как вы проверяете, установлен ли файл cookie? Файлы cookie доступны на следующей странице после их установки.

Распространенные подводные камни:

Файлы cookie не станут видимыми до следующей загрузки страницы, для которой они должны быть видны. Чтобы проверить, был ли успешно установлен файл cookie, проверьте наличие файла cookie на следующей странице загрузки до истечения срока действия файла cookie. Время истечения срока действия устанавливается с помощью параметра expire. Хороший способ отладить существование файлов cookie - это просто вызов print_r($_COOKIE);.

 2
Author: tkotitan, 2009-03-04 19:24:00

Я смог решить эту проблему, используя небольшую задержку в заголовке обновления. Мы устанавливаем заголовок (что должно быть сделано до любых методов, которые могут выводиться, например setcookie), а затем устанавливаем файлы cookie. Я добавил сообщение, чтобы пользователь не видел пустой экран в течение этих нескольких секунд.

    header("refresh: 2; url=$url");
    setcookie('type_id', $new_type_id, time() + 60*60*24*30, '/');
    echo "Processing, please wait...";
 2
Author: atonyc, 2015-11-23 21:09:31

Используйте относительный URL-адрес в заголовке:

@Header("Location: orders_9090_1.php");
 0
Author: Ondrej Konrady, 2016-05-20 16:16:18