使用http2预加载时php会话丢失

使用http2预加载时php会话丢失,php,session,http2,slim-3,Php,Session,Http2,Slim 3,我在php会话中使用HTTP/2推送预加载时遇到了一个问题:当我打开一个使用预加载头功能的页面时,会话丢失/重置。应用程序代码是开源的,下面是我设置链接头的地方: 。。。 $url=urlFor(“/$args[userCode]/$args[mediaCode]/raw”); $response=$response->withHeader('Link',“rel=preload;as={$type}”); ... 正如您在图片中看到的,HTTP/2推送实际上正在工作,但“推送”资源正在

我在php会话中使用HTTP/2推送预加载时遇到了一个问题:当我打开一个使用预加载头功能的页面时,会话丢失/重置。应用程序代码是开源的,下面是我设置链接头的地方:

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

正如您在图片中看到的,HTTP/2推送实际上正在工作,但“推送”资源正在重置会话(本例中的“原始”请求是一个图像,由PHP提供)。为什么会发生这种情况?

在Apache HTTP/2模块中

标题的完整列表如下所示:

Apache将查看原始请求(触发推送的请求)并将以下标题复制到推送请求上:
user-agent、accept、accept-encoding、accept-language、cache-control.

忽略所有其他标题。Cookie也不会被复制。推送需要cookie存在的资源将不起作用。这可能是一个争论的问题。但除非浏览器对此进行了更明确的讨论,否则我们还是要谨慎行事,不要在cookie通常不可见的地方公开cookie

请注意,它是如何明确指出不会发送cookies的。因此没有会话,因此您的PHP应用程序正在设置一个新会话

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

您可以使用带有
nopush
属性的
preload
标题来避免推送它,但浏览器仍会以高优先级请求它。当浏览器发出请求时,它将发送相应的cookie,所有cookie都将正常工作。它可能没有推的那么快安静,但通常已经足够好了。此外,由于浏览器知道其缓存,因此通常建议使用预加载而不是推送。-不仅仅是因为您在这里发现的问题。

在Apache HTTP/2模块中

标题的完整列表如下所示:

Apache将查看原始请求(触发推送的请求)并将以下标题复制到推送请求上:
user-agent、accept、accept-encoding、accept-language、cache-control.

忽略所有其他标题。Cookie也不会被复制。推送需要cookie存在的资源将不起作用。这可能是一个争论的问题。但除非浏览器对此进行了更明确的讨论,否则我们还是要谨慎行事,不要在cookie通常不可见的地方公开cookie

请注意,它是如何明确指出不会发送cookies的。因此没有会话,因此您的PHP应用程序正在设置一个新会话

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


您可以使用带有
nopush
属性的
preload
标题来避免推送它,但浏览器仍会以高优先级请求它。当浏览器发出请求时,它将发送相应的cookie,所有cookie都将正常工作。它可能没有推的那么快安静,但通常已经足够好了。此外,由于浏览器知道其缓存,因此通常建议使用预加载而不是推送。-不仅仅是因为您在这里发现的问题。

重置会话是什么意思?如果“raw”是一个图像,为什么它说它是text/html?这意味着当前会话无效,如请求中所示,头部设置了一个新的会话id。raw图像返回一个text/html,因为服务器抛出一个403禁止,因为该图像仅在登录用户中可见(并且因为会话无效)。只有在启用HTTP/2时才会发生这种情况,因为当不启用HTTP/2时,它会正常工作。我不明白为什么推送的资源使当前会话无效。在回答中描述的场景中,如果我返回到上一个页面,我将被重定向到登录页面,因为会话“reset”。Ok。我以为你的意思是HTTP/2会话无效(即会话被丢弃)。现在我明白你的问题了,我可以解释了。接下来回答..重置会话是什么意思?如果“raw”是一个图像,为什么它说它是text/html?这意味着当前会话无效,如请求中所示,头部设置了一个新的会话id。raw图像返回一个text/html,因为服务器抛出一个403禁止,因为该图像仅在登录用户中可见(并且因为会话无效)。只有在启用HTTP/2时才会发生这种情况,因为当不启用HTTP/2时,它会正常工作。我不明白为什么推送的资源使当前会话无效。在回答中描述的场景中,如果我返回到上一个页面,我将被重定向到登录页面,因为会话“reset”。Ok。我以为你的意思是HTTP/2会话无效(即会话被丢弃)。现在我明白你的问题了,我可以解释了。接下来是答案。感谢您的解释,我将避免在添加nopush属性的会话创建时推送资源。感谢您的解释,我将避免在添加nopush属性的会话创建时推送资源。
...
$url = urlFor("/$args[userCode]/$args[mediaCode]/raw");
$response = $response->withHeader('Link', "<{$url}>; rel=preload; as={$type}");
...