Отправка кук через AJAX в PHP

По умолчанию при AJAX запросе через функцию fetch не будут отправляться куки. Это регулируется настройкой credentials:

script.jslet response = await fetch('/ajax.php', {
  method: 'GET',
  credentials: 'some value here',
});

Давайте посмотрим, какие значения может принимать настройка credentials:

Значение Описание
omit Не отправлять куки в запросе. Эквивалентно отсутствию параметра credentials.
same-origin Отправлять куки только если запрос идет на тот же домен, что и текущая страница.
include Всегда отправлять куки даже при кросс-доменных запросах.

Давайте теперь поработаем с куками. Для начала по заходу на страницу index.php установим куку:

index.php<?php
  setcookie('test', '!!!', time() + 3600);
?>

На странице ajax.php выведем эту куку:

ajax.php<?php
  echo $_COOKIE['test'];
?>

Теперь выполним ручную проверку работы. Зайдите вручную через браузер сначала на index.php, а потом на ajax.php. Убедитесь, что кука выводится.

Давайте теперь сделаем AJAX запрос к нашей странице ajax.php. При этом не будем устанавливать настройку credentials. В этом случае куки отправлены не будут, на странице ajax.php значение куки не выведется и в ответе сервера мы ее не увидим:

script.jslet response = await fetch('/ajax.php', {
  method: 'GET',
});

let text = response.text();
console.log(text); // куки нет

Давайте теперь установим настройку credentials в значение same-origin. В этом случае кука отправится, будет доступна на сервере и вернется к нам обратно в качестве ответа:

script.jslet response = await fetch('/ajax.php', {
  method: 'GET',
  credentials: 'same-origin',
});

let text = response.text();
console.log(text); // кука есть
Задание 1

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