代码之家  ›  专栏  ›  技术社区  ›  SergiX44

使用http2 preload的php会话丢失

  •  0
  • SergiX44  · 技术社区  · 6 年前

    我在使用HTTP/2 push preload和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”); … < /代码>

    如图所示,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推送实际上正在工作,但“推送”资源正在重置会话(在本例中,“原始”请求是一个由PHP提供服务的图像)。为什么会这样?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Barry Pollard    6 年前

    在Apache HTTP/2模块中 only certain headers are copied on pushed request .

    标题的完整列表列在 n the Apache documentation

    Apache将查看原始请求(触发推送的请求),并将以下头文件复制到推送请求: user-agent, accept, accept-encoding, accept-language, cache-control.

    忽略所有其他头。cookies也不会被复制。推送需要cookie存在的资源将不起作用。这可能是一个有争议的问题。但是,除非与浏览器更明确地讨论这一点,否则我们要谨慎行事,不要将cookie暴露在原来看不见的地方。

    注意它是如何明确地调用不发送cookie的。因此没有会话,所以您的PHP应用程序正在设置一个新的会话。

    HTTP/2 push旨在发送安全的、可缓存的资源,Apache已选择解释这一点,因为它具有未经验证的资源。因此,除非您可以在不需要cookie的情况下为推送的资源提供服务,否则不应推送它。

    你可以使用 preload 头与 nopush 属性以避免推送它,但仍有浏览器以高优先级请求它。当浏览器请求它时,它将发送适当的cookie,并且所有cookie都应该工作。它可能不像push那么快就安静了,但它常常足够好。此外,由于浏览器知道它们的缓存,因此通常建议使用预加载而不是推送。 Push is complicated to get right -不仅仅因为你在这里发现的问题。