Сеанс php потерян с использованием предварительной загрузки http2 - PullRequest
0 голосов
/ 18 ноября 2018

У меня проблема с использованием предварительной загрузки HTTP / 2 с сеансом php: когда я открываю страницу, использующую функцию заголовка предварительной загрузки, сеанс теряется / сбрасывается. Код приложения с открытым исходным кодом, вот где я установил заголовок ссылки: https://github.com/SergiX44/XBackBone/blob/master/app/Controllers/UploadController.php#L107

...
$url = urlFor("/$args[userCode]/$args[mediaCode]/raw");
$response = $response->withHeader('Link', "<{$url}>; rel=preload; as={$type}");
...

request

raw request headers

Как вы можете видеть на рисунках, HTTP / 2 push фактически работает, но ресурс "push" сбрасывает сессию (в этом случае "raw" запрос - это изображение, обслуживаемое PHP). Почему это происходит?

1 Ответ

0 голосов
/ 19 ноября 2018

В модуле Apache HTTP / 2 только скопированные заголовки копируются по выдвинутому запросу .

Полный список заголовков приведен в i n документации Apache

Apache рассмотрит исходный запрос (тот, который вызвал PUSH) и скопирует следующие заголовки в запросы PUSH: user-agent, accept, accept-encoding, accept-language, cache-control.

Все остальные заголовки игнорируются. Файлы cookie также не будут скопированы. PUSHing ресурсы, для которых требуется cookie, не будут работать. Это может быть предметом обсуждения. Но если это не будет более четко обсуждено с браузером, давайте сделаем ошибку с осторожностью и не будем раскрывать куки, где они обычно не видны.

Обратите внимание на то, как явно указывается, что куки не будут отправлены. Поэтому сеанса нет, и поэтому ваше PHP-приложение устанавливает новый.

HTTP / 2 push предназначен для отправки безопасных, кэшируемых ресурсов, и Apache решил интерпретировать его как неаутентифицированные ресурсы. Поэтому, если вы не можете обслуживать свой отправленный ресурс без использования файлов cookie, вы не должны отправлять его.

Вы можете использовать заголовок preload с атрибутом nopush, чтобы избежать его нажатия, но браузер по-прежнему будет запрашивать его с высоким приоритетом. Когда браузер запрашивает его, он отправляет соответствующие файлы cookie, и все должно работать. Это может быть не так тихо, как толчок, но часто достаточно хорошо. Кроме того, поскольку браузеры знают о своем кеше, в любом случае часто рекомендуется использовать предварительную загрузку вместо push. Нажать сложно, чтобы получить право - и не только из-за проблемы, которую вы здесь заметили.

...