H2PushResource directive not working for http2 server push in Apache
我正在使用启用了h2的Apache HTTP服务器。 H2PushResource无法正常工作。 我想测试服务器推送。
我在httpd.conf文件中添加了以下额外的配置行。
1 2 3 4 5 | Protocols h2 http/1.1 H2PushResource on <If"%{DOCUMENT_URI} == '/testhttp2.html'"> H2PushResource add hello3.jpg </If> |
我在chrome dev-tools的Initiator字段中没有看到此资源的PUSH。
用于预加载的add Link标头工作正常。 预加载的发起方为"其他"(如预期)。
另外,有人可以向我解释HTTP2_SESSION_RECV_PUSH_PROMISE和HTTP2_SESSION_SEND_RST_STREAM吗? 我可以在chrome:// net-internals /中看到推送的资源
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | t=62561 [st= 4] HTTP2_SESSION_RECV_PUSH_PROMISE --> :scheme: https :authority: newapache.com:442 :path: style1.css :method: GET cache-control: no-cache user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36 accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 accept-encoding: gzip, deflate, br accept-language: en-US,en;q=0.9 host: newapache.com:442 --> id = 1 --> promised_stream_id = 4 t=62561 [st= 4] HTTP2_SESSION_SEND_RST_STREAM --> description ="Invalid pushed request headers." --> error_code ="7 (REFUSED_STREAM)" --> stream_id = 4 t=62562 [st= 5] HTTP2_SESSION_RECV_RST_STREAM --> error_code ="7 (REFUSED_STREAM)" --> stream_id = 4 |
您没有正确使用它。
该命令:
1 | H2PushResource add hello3.jpg |
应该具有相对于基本目录的完整路径,因此至少应有一个斜杠:
1 | H2PushResource add /hello3.jpg |
PUSH_PROMISE消息是从服务器发送到客户端的消息,内容为"我知道您没有要求,但现在我将向您发送此资源,如果有问题,请告诉我。"它的结构与HTTP请求(HTTP / 2中的HEADER帧)相似,只是它来自服务器而不是客户端-它基本上是服务器使用推送资源响应的伪请求。
RST_STREAM消息用于重置流-这意味着结束飞行中的下载。在这种情况下,客户端(Web浏览器)说"我不希望推送资源,因为我认为某些标头无效,因此这是一个错误的请求,无论如何我都会忽略它"。无效的标头是
解决此问题后,您还应该注意其他一些事项:
该资源必须由页面使用,否则它将被推送,但不会显示在"网络"选项卡中,并且将是毫无意义,浪费的推送。虽然它将显示在chrome:// net-internals中。
Chrome不允许将缓存(包括推送缓存)用于不安全的连接(例如,使用不受信任的自签名证书)。因此,除非您在Chrome中显示绿色的挂锁,否则推送的资源将被忽??略。
Apache会记住它已在该连接上推送了哪些资源,因此如果在同一连接上,则不应再次推送。使用此命令可以关闭此功能,以使其更易于测试:
1 | H2PushDiarySize 0 |
推送可能非常复杂,因此请查阅我即将出版的书中有关此内容的章节以获取更多信息:https://livebook.manning.com/#!/book/http2-in-action/chapter-5