Как я могу установить cookie, а затем перенаправить в PHP? - PullRequest
41 голосов
/ 04 марта 2009

После небольшой обработки я хочу установить значение 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

Ответы [ 5 ]

71 голосов
/ 04 марта 2009

Если у вас есть человеческие 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 будет доступен в пределах всего домена. Если установлено '/ foo /', файл cookie будет только доступно в каталоге / foo / и все подкаталоги, такие как / foo / bar / домена. По умолчанию значение - это текущий каталог, файл cookie устанавливается.

4 голосов
/ 04 марта 2009

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

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

2 голосов
/ 24 ноября 2015

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

    header("refresh: 2; url=$url");
    setcookie('type_id', $new_type_id, time() + 60*60*24*30, '/');
    echo "Processing, please wait...";
2 голосов
/ 04 марта 2009

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

Распространенные ловушки:

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

0 голосов
/ 20 мая 2016

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

@Header("Location: orders_9090_1.php");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...