Я, должно быть, упускаю некоторые основные вещи о куки. На localhost, когда я устанавливаю cookie на стороне сервера и указываю домен явно как localhost (или .localhost). cookie не принимается некоторыми браузерами.
Firefox 3.5: я проверил HTTP-запрос в Firebug. Что я вижу это:
Set-Cookie:
name=value;
domain=localhost;
expires=Thu, 16-Jul-2009 21:25:05 GMT;
path=/
или (когда я устанавливаю домен в .localhost):
Set-Cookie:
name=value;
domain=.localhost;
expires=Thu, 16-Jul-2009 21:25:05 GMT;
path=/
В любом случае, cookie не сохраняется.
IE8: я не использовал никаких дополнительных инструментов, но cookie, похоже, тоже не сохраняется, потому что он не отправляется обратно в последующих запросах.
Opera 9.64: и localhost, и .localhost работают , но когда я проверяю список файлов cookie в настройках, для домена устанавливается значение localhost.local, даже если он указан в списке localhost (в списке групп).
Safari 4: оба localhost и .localhost работают , но они всегда указаны в настройках как .localhost. С другой стороны, cookie без явного домена, он отображается как просто localhost (без точки).
В чем проблема с localhost? Из-за такого количества несоответствий должны быть специальные правила, касающиеся localhost. Кроме того, мне не совсем понятно, почему домены должны начинаться с префикса? RFC 2109 прямо заявляет, что:
Значение атрибута Domain не содержит встроенных точек или не начинается с точки.
Зачем? В документе указывается, что это связано с безопасностью. Я должен признать, что я не прочитал всю спецификацию (возможно, сделаю это позже), но это звучит немного странно. Исходя из этого, установка куки на localhost будет невозможна.
Ответы:
По своему дизайну доменные имена должны иметь как минимум две точки; в противном случае браузер сочтет их недействительными. (См. Ссылку на http://curl.haxx.se/rfc/cookie_spec.html. ).
При работе
localhost
домен cookie должен быть полностью опущен. Просто установив его""
илиNULL
илиFALSE
вместо"localhost"
этого недостаточно.Для PHP см. Комментарии на http://php.net/manual/en/function.setcookie.php#73107 .
Если вы работаете с Java Servlet API, не вызывайте
cookie.setDomain("...")
метод вообще.источник
Domain=
параметр при установке cookie. Если вы просто установите домен в null или пустой, возможно, ваша структура отправитDomain=
параметр с этим значением, а не пропустит его? Проверьте, например, Firebug.((domain && domain !== "localhost") ? ";domain="+domain : "")
Я в целом согласен с @Ralph Buchfelder, но здесь приведено некоторое усиление этого экспериментом при попытке реплицировать систему с несколькими поддоменами (например, example.com, fr.example.com, de.example.com) на моей локальной машине ( OS X / Apache / Chrome | Firefox).
Я отредактировал / etc / hosts, чтобы указать несколько воображаемых поддоменов на 127.0.0.1:
Если я работаю на fr.localexample.com и не указываю параметр домена, файл cookie правильно сохраняется для fr.localexample.com, но не отображается в других поддоменах.
Если я использую домен ".localexample.com", файл cookie правильно сохраняется для fr.localexample.com, и это видно в других поддоменов.
Если я использую домен "localexample.com" или когда я пробовал домен только "localexample" или "localhost", cookie не сохранялся.
Если я использую домен "fr.localexample.com" или ".fr.localexample.com", файл cookie правильно сохраняется для fr.localexample.com и (правильно) невидим в других поддоменах.
Таким образом, требование, что вам нужно как минимум две точки в домене, кажется правильным, хотя я не могу понять, почему это должно быть.
Если кто-то хочет попробовать это, вот несколько полезных кодов:
источник
localhost: вы можете использовать:
domain: ".app.localhost"
и это будет работать. Параметру 'domain' требуется 1 или более точек в имени домена для настройки файлов cookie. Тогда вы можете иметь сеансы работы через локальные поддомены , такие как:api.app.localhost:3000
.источник
express.session({cookie: { domain: '.app.localhost', maxAge: 24 * 60 * 60 * 1000 }})
.app.
пришествия? Это часть какой-то SPEC? И применимо ли это для всех несоответствующих доменов (без двух точек)? Кроме того, это будет работать со старыми браузерами? : ^)Когда cookie установлен с явным доменом 'localhost' следующим образом ...
... тогда браузеры игнорируют его, потому что он не включает как минимум два периода и не является одним из семи специально обработанных доменов верхнего уровня .
Обратите внимание, что число периодов выше, вероятно, предполагает, что требуется ведущий период. Этот период, однако, игнорируется в современных браузерах, и его, вероятно, следует читать ...
Обратите внимание, что значением по умолчанию для атрибута домена является имя хоста сервера, который сгенерировал ответ cookie .
Таким образом, обходной путь для файлов cookie, которые не устанавливаются для localhost, состоит в том, чтобы просто не указывать атрибут домена и позволить браузеру использовать значение по умолчанию - это, по-видимому, не имеет тех же ограничений, что и явное значение в атрибуте домена.
источник
Результаты, которые я изменил в браузере.
Chrome-127.0.0.1 работал, но localhost .localhost и "" не работали. Firefox- .localhost работал, но localhost, 127.0.0.1 и "" не работали.
Не тестировали в Opera, IE или Safari
источник
Domain=
параметра работает.Domain=
тоже работает, ноDomain=localhost
нет.Потратил много времени на устранение этой проблемы самостоятельно.
Использование PHP, и ничего на этой странице не работает для меня. В конце концов я понял в своем коде, что параметр «secure» для PHP для session_set_cookie_params () всегда был установлен в TRUE.
Так как я не посещал localhost с https, мой браузер никогда не будет принимать cookie. Итак, я изменил эту часть своего кода, чтобы условно установить параметр «secure», основываясь на том, что $ _SERVER ['HTTP_HOST'] равен 'localhost' или нет. Работает хорошо сейчас.
Я надеюсь, что это поможет кому-то.
источник
Если вы устанавливаете cookie из другого домена (то есть вы устанавливаете cookie, отправляя запрос XHR с перекрестным происхождением), то вам нужно убедиться, что для
withCredentials
атрибута установлено значение true в XMLHttpRequest, который вы используете для получения cookie, как описано здесьисточник
Вы можете использовать
localhost.org
или, скорее,.localhost.org
он всегда будет разрешать127.0.0.1
источник
Мне повезло, когда я тестировал локально, используя 127.0.0.1 в качестве домена. Я не уверен почему, но у меня были смешанные результаты с localhost и .localhost и т. Д.
источник
Ни одно из предложенных исправлений не сработало для меня - установка нулевого, ложного, добавление двух точек и т. Д. - не сработало.
В конце я просто удалил домен из cookie, если это localhost, и теперь он работает для меня в Chrome 38 .
Предыдущий код (не работал):
Новый код (сейчас работает):
источник
У меня была та же проблема, и я исправил ее, поместив 2 точки в самом имени файла cookie без указания какого-либо домена.
источник
Кажется, есть проблема, когда вы используете,
https://<local-domain>
а затемhttp://<local-domain>
.http://
Сайт не посылает печенье с запросами послеhttps://
множества сайтов им. Принудительная перезагрузка и очистка кеша не помогают. Работает только ручная очистка куки. Кроме того, если я очистить их наhttps://
странице, тоhttp://
страница снова начинает работать.Похоже, связано с "Строго безопасные куки". Хорошее объяснение здесь . Был выпущен в Chrome 58 2017-04-19.
Похоже, что на самом деле Chrome записывает как безопасные, так и небезопасные файлы cookie, поскольку при нажатии на значок в адресной строке будут отображаться правильные файлы cookie в зависимости от протокола страницы.
Но
Developer tools > Application > Cookies
не будет отображать незащищенный файл cookie, когда существует безопасный файл cookie с тем же именем для того же домена, а также не будет отправлять незащищенный файл cookie с любыми запросами. Это похоже на ошибку Chrome, или, если ожидается такое поведение, должен быть какой-то способ просмотра безопасных файлов cookie приhttp
странице и указания, что они переопределяются.Обходной путь - использовать разные именованные куки-файлы в зависимости от того, предназначены ли они для http-сайта или https-сайта, и называть их в зависимости от вашего приложения.
__Secure-
Префикс указывает на то, что куки должны быть строго в безопасности, а также является хорошей практикой , так как безопасный и незащищенное не будут сталкиваться. Есть и другие преимущества префиксов .Использование разных
/etc/hosts
доменов для https и http-доступа тожеhttps://localhost
подойдет , но одно случайное посещение предотвратит работу куки-файлов с одинаковыми именами наhttp://localhost
сайтах - так что это не хороший обходной путь.Я подал отчет об ошибке Chrome .
источник
document.cookie = valuename + "=" + value + ";" + expires + "; домен =; путь = /";
это "домен =; путь = /"; будет принимать динамический домен, так как его cookie будет работать в поддомене. если вы хотите проверить в localhost, он будет работать
источник
Ни один из ответов здесь не работал для меня. Я исправил это, поместив свой PHP как самую первую вещь на странице.
Как и другие заголовки, куки должны быть отправлены до любого вывода из вашего скрипта (это ограничение протокола). Для этого необходимо, чтобы вы вызывали эту функцию до любого вывода, включая теги и любые пробелы.
От http://php.net/manual/en/function.setcookie.php
источник
Существует проблема, связанная с открытием Chromium с 2011 года: если вы явно указываете домен как «localhost», вы должны установить его как
false
илиundefined
.источник
Я немного поиграл.
работает в Firefox и Chrome на сегодняшний день. Однако я не нашел способа заставить его работать с curl. Я попробовал Host-Header и --resolve, не повезло, любая помощь приветствуется.
Тем не менее, он работает в curl, если я установил его
вместо. (Который не работает с Firefox.)
источник
Еще одна важная деталь : expires = должен использовать следующий формат даты и времени: Wdy, DD-Mon-YYYY HH: MM: SS GMT ( RFC6265 - Раздел 4.1.1 ).
источник
После долгих экспериментов и чтения различных постов это сработало. Я мог бы установить несколько файлов cookie, прочитать их обратно, установить отрицательное время и удалить их.
источник
Единственное, что сработало для меня, это установить
Path=/
печенье.Более того, значение атрибута пути по умолчанию отличается от браузера к браузеру, хотя я протестировал только два из них (Firefox и Chrome).
Chrome пытается установить cookie как есть; если
path
атрибут не указан вSet-Cookie
заголовке, он не будет сохранен и проигнорирован.Тем не менее, Firefox хранит cookie даже без явного
path
атрибута. Это просто установить его с запрошенным путем; URL моего запроса был/api/v1/users
и путь был установлен/api/v1
автоматически.Во всяком случае, оба браузера работали, когда
path
было установлено/
даже без явного домена, то естьDomain=localhost
или что-то. Таким образом, существуют некоторые различия в том, как каждый браузер обрабатывает файлы cookie.источник