我正在使用启用了h2的Apache HTTP服务器。 H2PushResource无法正常工作。我要测试服务器推送。
我在httpd.conf文件中添加了以下额外的配置行。
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 /
中看到已推送的资源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
答案 0 :(得分:1)
您没有正确使用它。
此命令:
H2PushResource add hello3.jpg
应具有相对于基本目录的完整路径,因此至少应有一个斜杠:
H2PushResource add /hello3.jpg
PUSH_PROMISE消息是从服务器发送到客户端的消息,内容为“我知道您没有要求,但现在我将向您发送此资源,如果有问题,请告诉我。”它的结构与HTTP请求(HTTP / 2中的HEADER帧)相似,只是它来自服务器而不是客户端,它基本上是服务器用推送的资源响应的伪请求。
RST_STREAM消息用于重置流-这意味着结束飞行中的下载。在这种情况下,客户端(Web浏览器)说“我不希望推送资源,因为我认为某些标头无效,因此这是一个错误的请求,无论如何我都会忽略它”。无效的标头是:path
伪标头,应为/hello3.jpg
而不是hello3.jpg
。
修复此问题后,您还应该注意其他一些事情:
该资源必须由页面使用,否则它将被推送但不会显示在“网络”选项卡中,并且将是毫无意义,浪费的推送。尽管它将显示在chrome:// net-internals中。
Chrome不允许将缓存(包括推送缓存)用于不安全的连接(例如,使用不受信任的自签名证书)。因此,除非您在Chrome中显示绿色的挂锁,否则推送的资源将被忽略。
Apache会记住它已在该连接上推送了哪些资源,因此如果在同一连接上,则不应再次推送。使用此命令可以关闭此功能,以使其更易于测试:
H2PushDiarySize 0
推送可能会非常复杂,因此请查阅我即将出版的书中有关该章节的更多信息:https://livebook.manning.com/#!/book/http2-in-action/chapter-5