Я пытаюсь установить путь в setcookie для файла cookie моего веб-сайта, который содержит строку, за которой следует #wall, я мог видеть путь только до первой строки, он не принимает # дробь пути.
код выглядит так:
$wall = array(
$this->database,
$this->response['grouplist'][0],
$this->username
);
setcookie(
"wall",
json_encode($wall),
time() + 3600 * 24 * 1000 ,
"/" + $this->database + "/#wall",
".mywebsite.com",
0
);
session_set_cookie_params(0, '/', '.mywebsite.com');
выход :
mywebsite.com /S71c9524b57ab1b3383bcb14478b570b6 2019-07-16T06:37:55.065Z 92
#
символ указывает на фрагмент часть URL (RFC 3986):
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
hier-part = "//" authority path-abempty
/ path-absolute
/ path-rootless
/ path-empty
Итак, фрагмент (wall
в частности) является другой частью URL и является не считается частью дорожка:
Путь заканчивается первым знаком вопроса («?») Или знаком числа
(«#») или к концу URI.
Более того, фрагменты зависят от типа документа MIME и оцениваются пользовательским агентом (RFC 3986, 3.5. Фрагмент), то есть фрагменты никогда не отправляются на сервер:
…идентификатор фрагмента не используется в конкретной схеме
обработка URI; вместо этого идентификатор фрагмента отделяется
от остальной части URI до разыменования, и, таким образом,
идентификационная информация внутри самого фрагмента разыменовывается
исключительно пользовательским агентом …
Другими словами, фрагменты URL не должны работать в cookie Path
атрибуты, и сервер не должен ничего знать о фрагментах.
Также обратите внимание, +
является арифметическим оператором, поэтому ваш "/" + $this->database + "/#wall"
оценивается в 0
, Если вы имели в виду конкатенацию, используйте .
(точка) вместо этого:
$s = 'abc';
echo "/" + $s + "/#wall", PHP_EOL;
echo "/" . $s . "/#wall", PHP_EOL;
echo "/{$s}/#wall", PHP_EOL;
Выход
0
/abc/#wall
/abc/#wall
Таким образом, вы должны заменить свое «арифметическое» выражение "/{$this->database}/#wall"
,
Я проверил, как текущая версия Mozilla Firefox обрабатывает файлы cookie для пути с различными фрагментами. Оказывается, он на самом деле пишет куки в document.cookie
для разных фрагментов, но нужно обновить страницу, чтобы обновить куки. Поэтому я сомневаюсь, что это полезная функция.
Других решений пока нет …