2009-09-02 6 views
1

Я работаю локально через две «домены». У меня есть enterprise.local и application.local виртуальные хосты на моей машине, и мне нужно установить cookie домена для «local» или «.local». У меня возникают проблемы с настройкой файла cookie. В application.local, у меня есть это:Проблема Настройка Cookie с PHP

setcookie('iPlanetDirectoryPro', trim($token_id), '0', '/', '.local'); 
header('Location: /adcom-sso'); 

Я также попытался это:

header('Set-Cookie: iPlanetDirectoryPro=' . trim($token_id) . '; path=/'); 
header('Location: /adcom-sso'); 

setcookie() Использование, не печенье не ступала. Используя заголовок Set-Cookie, cookie - комплект. Я удалил перенаправление с обоих, и результат никогда не меняется. Он работает для Set-Cookie, но не для setcookie(). Это было бы хорошо, так как я на самом деле не имею предпочтения, какое решение я использую, но в Set-Cookie растворе, как только я добавить домен это все ломается:

header('Set-Cookie: iPlanetDirectoryPro=' . trim($token_id) . '; path=/; domain=local'); 

Как только я добавляю в значение домена, я получаю ошибку заголовка:

Header may not contain more than a single header, new line detected. 

Я попробовал значение домена в качестве «местного» и «Местных». Поведение не меняется.

Мне редко приходится явно обращаться к файлам cookie, поэтому я надеюсь, что у меня просто отсутствует что-то очевидное, но я, конечно, не вижу его. Любое понимание было бы высоко оценено.

UPDATE: Я думаю, что я сузил это немного дальше. Кажется, что оба способа будут работать , пока я не включаю значение домена. Может ли быть проблема с использованием «local» или «.local» в качестве конкретного домена для cookie?

ответ

2

EDIT: Я теперь имел вид на RFC2109, 4.3.2 отвергая Кук:

  • The value for the Domain attribute contains no embedded dots or does not start with a dot.

    ...

  • A Set-Cookie with Domain=.com or Domain=.com., will always be rejected, because there is no embedded dot.

Это кажется, что браузер отвергает «Местный» из-за соображения безопасности. Чтобы установить файл cookie для домена, он должен содержать не менее двух точек (например, .cookiedomain.local).

Установка печенья из одного субдомена (например, one.local) для другого субдомена (например, another.local) невозможна AFAIK. Что вы можете сделать, чтобы преодолеть эту проблему, перенаправляет пользователя в домен cookie, который устанавливает/получает все куки и перенаправляет пользователя снова туда, откуда они пришли, с данными cookie, включенными в URL-адрес в качестве параметров запроса. Microsoft делает (или делает) это как это для своих собственных доменов (msn.com, microsoft.com).


ошибка, что вы получите («Заголовок не может содержать ...») включаются только если строка вы передаете в качестве аргумента header() содержит символ перевода строки, не следует либо пробел или (который будет продолжать заголовок на следующей строке).

Теперь setcookie() на самом деле urlencode() его значение (setrawcookie() не будет), поэтому строка перевода не вызовет ошибку.

С другой стороны, функция trim() будет пропускать пробелы только с начала и конца аргумента и оставить любые другие символы перевода строки неповрежденными. Возможно, вы могли бы попробовать что-то вроде preg_replace('/\s+/', '').

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

Однако это не объясняет, почему ваш первый header() работает (с переводом строк в нем); кажется, что некоторые из ваших значений cookie имеют переводы строк в них, а некоторые нет.

Настройка домена на «.local» (ведущий «.») - это правильная вещь, кстати, если вы хотите, чтобы субдомены увидели файл cookie.

Некоторые дополнительные замечания о настройке файлов cookie с setcookie() обсуждаются в документации PHP (особенно комментарии пользователей).

+0

Я действительно пробовал все это. Первоначально я вообще не обрезался. Я также попробовал setrawcookie(), хотя я не включил его здесь для простоты. В решении Set-Cookie я также попробовал вручную urlencode(), используя $ token_id. Я просто попробовал идею preg_replace() и ничего не изменил. Благодарю. –

+0

«Заголовок может не содержать ...» будет * не * срабатывать, если у вас нет перевода строки. Я посмотрел исходный код PHP ('sapi_header_op()'). У вас определенно есть проблема с возвратом строки с этой ошибкой. – Inshallah

+0

То, что я в конечном счете отслеживал, соответствовало вашим изменениям. Как только я попробовал «.local.com», все прошло гладко. В этом случае проблема была из-за моей среды dev, где я сохраняю свои «домены» простыми. Это не должно быть проблемой для стека в производственных средах. Спасибо за вашу помощь. –

 Смежные вопросы

  • Нет связанных вопросов^_^