cookies — добавление фрагмента Hash после пути в функцию setcookie Stack Overflow

Я пытаюсь установить путь в 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

2

Решение

Фрагмент не является частью пути

# символ указывает на фрагмент часть 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 атрибуты, и сервер не должен ничего знать о фрагментах.

Синтаксис PHP

Также обратите внимание, + является арифметическим оператором, поэтому ваш "/" + $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 для разных фрагментов, но нужно обновить страницу, чтобы обновить куки. Поэтому я сомневаюсь, что это полезная функция.

1

Другие решения

Других решений пока нет …