Куки на локальном хосте с явным доменом
Я, должно быть, пропустил некоторые основные вещи о печенье. На localhost, когда я устанавливаю куки на стороне сервера и укажите домен явно как localhost (или .локальный хост.) куки, похоже, не принимаются некоторыми браузерами.
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 работа, но когда я проверяю список куки в настройках, домен устанавливается на localhost.локальный, хотя он указан в разделе localhost (в группе списков).
Safari 4: как localhost и .localhost работа, но они всегда указаны в качестве .localhost в настройках. С другой стороны, cookie без явного домена, он отображается как просто localhost (без точки).
в чем проблема с localhost? Из-за такого количества несоответствий должны существовать некоторые специальные правила, касающиеся localhost. Кроме того, мне не совсем понятно, почему домены должны иметь префикс точки? RFC 2109 явно заявляет, что:
значение Атрибут домена
не содержит встроенных точек или нет
начните с точки.
почему? Документ указывает, что он должен что-то сделать с безопасностью. Я должен признать, что я не читал всю спецификацию (может быть, позже), но это звучит немного странно. Исходя из этого, установка cookies на localhost будет невозможна.
15 ответов:
по дизайну доменные имена должны иметь не менее двух точек; в противном случае браузер будет считать их недействительными. (См. ссылку на 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("...")метод на всех.
Я в целом согласен с @Ralph Buchfelder, но вот некоторое усиление этого, путем эксперимента при попытке реплицировать систему с несколькими поддоменами (например example.com, fr.example.com, de.example.com) на моей локальной машине (OS X / Apache|Chrome / Firefox).
я отредактировал/etc / hosts, чтобы указать некоторые воображаемые поддомены в 127.0.0.1:
127.0.0.1 localexample.com 127.0.0.1 fr.localexample.com 127.0.0.1 de.localexample.comЕсли я работаю над fr.localexample.com и я оставляю параметр домена, файл cookie хранится правильно для fr.localexample.com, но не видно в других поддоменах.
Если я использую домен ".localexample.com", cookie хранится правильно для fr.localexample.com и и виден в других поддоменах.
Если я использую домен "localexample.com", или когда я пытался домен просто "localexample" или "localhost", cookie не сохранялся.
Если я использую домен "fr.localexample.com " или". fr.localexample.com", печенье есть сохраненный правильно для fr.localexample.com и является (правильно) невидимым в других поддоменах.
таким образом, требование, что вам нужно по крайней мере две точки в домене, кажется правильным, хотя я не вижу, почему это должно быть.
Если кто-нибудь хочет попробовать это, вот некоторые полезные код:
<html> <head> <title> Testing cookies </title> </head> <body> <?php header('HTTP/1.0 200'); $domain = 'fr.localexample.com'; // Change this to the domain you want to test. if (!empty($_GET['v'])) { $val = $_GET['v']; print "Setting cookie to $val<br/>"; setcookie("mycookie", $val, time() + 48 * 3600, '/', $domain); } print "<pre>"; print "Cookie:<br/>"; var_dump($_COOKIE); print "Server:<br/>"; var_dump($_SERVER); print "</pre>"; ?> </body> </html>
localhost: вы можете использовать:
domain: ".app.localhost"и оно будет работать. Элемент параметр'domain' требует 1 или более точек в доменном имени для установки cookies. Затем вы можете иметь сеансы, работающие через localhost поддоменов, таких как:api.app.localhost:3000.
когда файл cookie установлен с явным доменом 'localhost' следующим образом...
Set-Cookie: name=value; домен=localhost; expires=Чт, 16-Jul-2009 21: 25: 05 GMT; path=/
...тогда браузеры игнорируют его, потому что это не включает по крайней мере два периода и не является одним из семи специально обработанных доменов верхнего уровня.
...домены должны иметь по крайней мере два (2) или три (3) периода в них, чтобы предотвратить Домены вида: ".ком", ".еду", а "ва.нас". Любой домен это не удается в одном из семи специальных доменов верхнего уровня, перечисленных ниже требуется только два периода. Любой другой домен требует, по крайней мере три. Семь специальных доменов верхнего уровня: "COM", "EDU", " NET", "ORG", "GOV", "MIL"и " INT".
обратите внимание, что количество периодов выше, вероятно, предполагает, что требуется начальный период. Однако этот период игнорируется в современных браузерах и это, вероятно, следует прочитать...
по крайней мере один (1) или два (2) периода
обратите внимание, что значение по умолчанию для атрибута домена:имя хоста сервера, который сгенерировал ответ cookie.
Так обходной путь для файлов cookie, не установленных для localhost, заключается в том, чтобы просто не указывать атрибут домена и пусть браузер использует значение по умолчанию - это не похоже на то же самое ограничения, которые делает явное значение в атрибуте домена.
результаты я варьировал в зависимости от браузера.
Chrome-127.0.0.1 работал, но localhost .localhost и "" не. браузер Firefox. -localhost работал, но localhost, 127.0.0.1 и "" не работали.
не тестировались в Opera, IE или Safari
потратил много времени на устранение этой проблемы сам.
с помощью PHP, и ничего на этой странице не работал для меня. В конце концов я понял в своем коде, что параметр "secure" для PHP session_set_cookie_params () всегда было установлено значение TRUE.
Так как я не посещал localhost с https, мой браузер никогда не примет cookie. Итак, я изменил эту часть своего кода, чтобы условно установить "безопасный" параметр на основе $_SERVER ['HTTP_HOST'] быть "localhost" или нет. Теперь работает хорошо.
Я надеюсь, что это кому-то поможет.
мне гораздо больше повезло тестировать локально, используя 127.0.0.1 в качестве домена. Я не знаю, почему, но у меня были смешанные результаты с localhost и .на localhost и т. д.
ни одно из предложенных исправлений не сработало для меня-установка его в null, false, добавление двух точек и т. д.-не сработало.
в конце концов, я просто удалил домен из файла cookie, если это localhost, и теперь это работает для меня в Chrome 38.
предыдущий код (не работает):
document.cookie = encodeURI(key) + '=' + encodeURI(value) + ';domain=.' + document.domain + ';path=/;';новый код (сейчас работает):
if(document.domain === 'localhost') { document.cookie = encodeURI(key) + '=' + encodeURI(value) + ';path=/;' ; } else { document.cookie = encodeURI(key) + '=' + encodeURI(value) + ';domain=.' + document.domain + ';path=/;'; }
документ.cookie = valuename + " = " + value +"; " + expires+"; domain=; path=/";
этот " домен=; путь=/"; будет принимать динамический домен, так как его cookie будет работать в поддомене. если вы хотите проверить в localhost это будет работать
ни один из ответов здесь работал для меня. Я исправил это, поставив свой PHP как самое первое на странице.
как и другие заголовки, куки должны быть отправлены до любого вывода из скрипта (это ограничение протокола). Это требует, чтобы вы размещали вызовы этой функции до любого вывода, включая и теги, а также любые пробелы.
есть выпуск на хроме открыт с 2011 года, что если вы явно устанавливаете домен как 'localhost', вы должны установить его как
falseилиundefined.
Я играл вокруг немного.
Set-Cookie: _xsrf=2|f1313120|17df429d33515874d3e571d1c5ee2677|1485812120; Domain=localhost; Path=/работает в Firefox и Chrome на сегодняшний день. Однако я не нашел способа заставить его работать с curl. Я попробовал Host-Header и -- resolve, не повезло,любая помощь оценена.
однако он работает в curl, если я установил его в
Set-Cookie: _xsrf=2|f1313120|17df429d33515874d3e571d1c5ee2677|1485812120; Domain=127.0.0.1; Path=/вместо. (Который не работает с Firefox.)
еще одна важная деталь, о истекает= использовать следующий формат даты и времени: Wdy, DD-Mon-YYYY HH: MM:SS GMT (RFC6265-раздел 4.1.1).
Set-Cookie: name=value; domain=localhost; expires=Thu, 16-07-2019 21:25:05 GMT; path=/
У меня была такая же проблема и я исправил ее, поставив 2 точки в само название печенья без указания домена.
set-cookie: name.s1.s2=value; path=/; expires=Sun, 12 Aug 2018 14:28:43 GMT; HttpOnly
там, кажется, проблема, когда вы используете
https://<local-domain>а тоhttp://<local-domain>. Элементhttp://сайт не отправляет куки с просьбами послеhttps://сайт устанавливает их. Перезагрузка и очистка кэша не помогает. Работает только ручная очистка cookies. Кроме того, если я очищаю их наhttps://страница, затемhttp://страница снова начинает работать.похоже, что это связано с"строгими безопасными куки". Хорошее объяснение здесь. Это было выпущен в Chrome 58 on 2017-04-19.
похоже, что Chrome действительно записывает как безопасные куки, так и незащищенные куки, поскольку он будет показывать правильные куки в зависимости от протокола страницы при нажатии на значок адресной строки.
но
Developer tools > Application > Cookiesне будет показывать незащищенный файл cookie, когда есть безопасный файл cookie с тем же именем для того же домена, и он не будет отправлять незащищенный файл cookie с любыми запросами. Это похоже на ошибку Chrome, или если такое поведение ожидается, должны быть некоторые способ просмотра защищенных файлов cookie, когда наhttpстраницы и указание на то, что они переопределяются.обходной путь заключается в использовании различных именованных файлов cookie в зависимости от того, предназначены ли они для http-сайта или https-сайта, и называть их конкретными для вашего приложения. А
__Secure-префикс указывает, что файл cookie должен быть строго безопасным, а также является хорошей практикой, потому что безопасный и небезопасный не будут сталкиваться. Есть другие преимущества тоже префиксов.используя разные
/etc/hostsдомены для https и http-доступа тоже будут работать, но один случайныйhttps://localhostпосещение предотвратит любые куки с одинаковыми именами для работы наhttp://localhostсайты-так что это не очень хороший обходной путь.я подал отчет об ошибке Chrome.
Comments