Куки файлы на локальном хосте с явным доменом

Мне нужно пропустить некоторые основные вещи о куки. На 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 не содержит встроенных точек или не начните с точки.

Почему? Документ указывает, что он должен что-то сделать с безопасностью. Я должен признать, что я не прочитал всю спецификацию (может сделать это позже), но это звучит немного странно. Исходя из этого, установка файлов cookie на localhost будет невозможна.

Ответ 1

По дизайну имена доменов должны иметь не менее двух точек; в противном случае браузер считает их недействительными. (См. Ссылку на http://curl.haxx.se/rfc/cookie_spec.html)

При работе с localhost домен cookie должен быть полностью опущен. Просто установить его на "" или NULL или FALSE вместо "localhost" недостаточно.

Для PHP см. комментарии к http://php.net/manual/en/function.setcookie.php#73107.

Если вы работаете с API-интерфейсом Java Servlet, не вызывайте метод cookie.setDomain("...") вообще.

Ответ 2

Я в целом согласен с @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", cookie хранится правильно для 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>

Ответ 3

localhost: Вы можете использовать: domain: ".app.localhost", и он будет работать. Параметру "domain" требуется имя в имени домена для установки файлов cookie. Затем вы можете иметь сеансы, работающие через субдомены localhost, такие как: api.app.localhost:3000.

Ответ 4

Когда cookie установлен с явным доменом 'localhost' следующим образом...

Set-Cookie: имя = значение; домен = localhost; истекает = чт, 16 июля 2009 21:25:05 по Гринвичу; Путь =/

... тогда браузеры игнорируют его, потому что он не включает как минимум два периода и не является одним из семи специально обработанных доменов верхнего уровня.

... домены должны иметь по крайней мере два (2) или три (3) периода в них для предотвращения доменов в форме: ".com", ".edu" и "va.us". Любой домен, который выходит из строя в пределах одного из семи специальных доменов верхнего уровня, перечисленных ниже, требует только двух периодов. Любой другой домен требует как минимум три. Семь специальных доменов верхнего уровня: "COM", "EDU", "NET", "ORG", "GOV", "MIL" и "INT".

Обратите внимание, что число периодов выше, вероятно, предполагает, что требуется ведущий период. Этот период, однако, игнорируется в современных браузерах, и его, вероятно, следует читать...

по крайней мере, один (1) или два (2) периода

Обратите внимание, что значением по умолчанию для атрибута домена является имя хоста сервера, который сгенерировал ответ cookie.

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

Ответ 5

Результаты, которые я изменил в браузере.

Chrome-127.0.0.1 работал, но localhost.localhost и "" не сделал. Firefox-.localhost работал, но localhost, 127.0.0.1 и "" не сделал.

Не тестировались в Opera, IE или Safari

Ответ 6

Провел много времени, чтобы устранить эту проблему самостоятельно.

Использование PHP и Nothing на этой странице работало для меня. В конце концов я понял в своем коде, что "безопасный" параметр PHP session_set_cookie_params() всегда был установлен в TRUE.

Поскольку я не посещал localhost с https, мой браузер никогда не согласился бы с файлом cookie. Таким образом, я модифицировал эту часть своего кода, чтобы условно установить "безопасный" параметр на основе $_SERVER ['HTTP_HOST'], который является "localhost" или нет. Теперь хорошо работайте.

Я надеюсь, что это поможет кому-то.

Ответ 7

Мне было гораздо лучше, если вы тестировали локально, используя 127.0.0.1 в качестве домена. Я не уверен, почему, но у меня были смешанные результаты с localhost и .localhost и т.д.

Ответ 8

Ни одна из предложенных исправлений не работала для меня - установка нуля, ложь, добавление двух точек и т.д. - не работала.

В конце концов, я просто удалил домен из файла 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=/;';
    }

Ответ 9

Кажется, есть проблема, когда вы используете https://<local-domain> а затем http://<local-domain>. Сайт http:// не отправляет файлы cookie с запросами после того, как сайт https:// устанавливает их. Принудительная перезагрузка и очистка кеша не помогают. Работает только ручная очистка куки. Кроме того, если я очищаю их на странице https:// страница http:// снова начинает работать.

Похоже, связано с "Строго безопасные куки". Хорошее объяснение здесь. Он был выпущен в Chrome 58 2017-04-19.

Похоже, что на самом деле Chrome записывает как безопасные, так и небезопасные файлы cookie, поскольку при нажатии на значок в адресной строке будут отображаться правильные файлы cookie в зависимости от протокола страницы.

Но Developer tools > Application > Cookies не будут отображать незащищенный файл cookie, когда есть безопасный файл cookie с тем же именем для того же домена, и не будут отправлять незащищенный файл cookie с любыми запросами. Это похоже на ошибку Chrome, или, если такое поведение ожидается, должен быть какой-то способ просмотра защищенных файлов cookie на странице http и указания, что они переопределяются.

Обходной путь - использовать разные именованные куки файлы в зависимости от того, предназначены ли они для http-сайта или https-сайта, и называть их в соответствии с вашим приложением. __Secure- указывает, что файл cookie должен быть строго защищенным, а также является хорошей практикой, поскольку безопасные и небезопасные не конфликтуют. У префиксов есть и другие преимущества.

Использование разных доменов /etc/hosts для https и http-доступа тоже будет работать, но одно случайное посещение https://localhost предотвратит работу файлов cookie с одинаковыми именами на сайтах http://localhost - так что это не очень хорошо обходной путь.

Я подал отчет об ошибке Chrome.

Ответ 10

Еще одна важная деталь, expires =, должна использовать следующий формат даты: 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=/

Ответ 11

document.cookie = valueename + "=" + value + ";" + expires + "; domain =; path =/";

this "domain =; path =/"; будет принимать динамический домен, поскольку его cookie будет работать в субдомене. если вы хотите протестировать в localhost, он будет работать

Ответ 12

Ни один из ответов здесь не работал у меня. Я исправил это, поставив свой PHP в качестве самой первой вещи на странице.

Как и другие заголовки, файлы cookie должны быть отправлены до выхода из вашего script (это ограничение протокола). Это требует, чтобы вы отправляли вызовы этой функции до любого вывода, включая и теги, а также любые пробелы.

Из http://php.net/manual/en/function.setcookie.php

Ответ 13

Существует проблема с на Chromium open с 2011 года, если вы явно устанавливаете домен как "localhost", вы должны установить его как false или undefined.

Ответ 14

Я немного поиграл.

Set-Cookie: _xsrf=2|f1313120|17df429d33515874d3e571d1c5ee2677|1485812120; Domain=localhost; Path=/

работает в Firefox и Chrome на сегодняшний день. Однако я не нашел способ заставить его работать с завитом. Я попробовал Host-Header и --resolve, не повезло, любая помощь была оценена.

Однако он работает в curl, если я устанавливаю его на

Set-Cookie: _xsrf=2|f1313120|17df429d33515874d3e571d1c5ee2677|1485812120; Domain=127.0.0.1; Path=/

вместо этого. (Что не работает с Firefox.)

Ответ 15

У меня была та же проблема, и я исправил ее, поместив 2 точки в самом имени файла cookie, не указав домен.

set-cookie: name.s1.s2=value; path=/; expires=Sun, 12 Aug 2018 14:28:43 GMT; HttpOnly

Ответ 16

Если вы устанавливаете cookie файл из другого домена (то есть вы устанавливаете cookie файл, отправляя запрос перекрестного происхождения withCredentials), то вам необходимо убедиться, что для атрибута withCredentials установлено withCredentials true в XMLHttpRequest, который вы используете для получения cookie файла, как описано здесь.

Ответ 17

Вы можете использовать localhost.org или, скорее, .localhost.org он всегда будет разрешаться до 127.0.0.1