我试图利用HTTP 100 continue
与preload
头预加载一些内容到浏览器。
问题是我没有得到预期的结果。
下面是我的示例代码:
header('HTTP/1.1 100 Continue');
header('Link: </assets/style.css>; rel=preload');
header('Link: </assets/app.js>; rel=preload');
header(''); // send empty line to end 100 continue section
flush();
sleep (4); // Emulate some processing while browser is preloading assets
header('HTTP/1.1 200 OK');
echo "aaa\n";
echo "bbb\n";
flush();
exit;
但不是预期的响应:
HTTP/1.1 100 Continue
Link: </assets/style.css>; rel=preload
Link: </assets/app.js>; rel=preload
HTTP/1.1 200 OK
aaa
bbb
我得到了这个:
HTTP/1.1 200 OK
Date: Wed, 04 Oct 2023 15:21:24 GMT
Server: Apache/2.4.57 (Ubuntu)
Link: </assets/app.js>; rel=preload
Upgrade: h2,h2c
Connection: Upgrade
Vary: Accept-Encoding
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8
aaa
bbb
我是不是漏了什么?
除了flush()
,我还需要其他东西来发送100 continue
报头吗?
我当前的堆栈是apache
+ php-fpm
。
我使用的命令是curl -i https://localhost/
此外,我将使用这个与symfony项目,所以我需要确保重置headers_sent()
后,100 continue
部分,或symfony将只是不发送任何东西(发送功能开始与if(headers_sent()) return;
),
但我不知道如何重置后,第一冲水。
1条答案
按热度按时间oogrdqng1#
预加载只是提前告诉浏览器一些资源需要被获取,这减少了页面的加载和可能的呈现时间。
通常你的浏览器在从html中读取css/js/images/etc时会加载它们,这些html会被逐行解析。如果你的html很大,你可以告诉浏览器在浏览器在HTML中看到它们之前加载一些资源(因为它已经在响应头中看到了它们)。
你不需要先刷新内容,在读取html之前总是先读取标题。只要浏览器看到一个预加载,它就开始拉取该文件,甚至在html被解析之前。
你唯一需要做的就是提前应用这些头文件。这就是为什么大多数框架不使用
<?php echo "<html>" ?>
,因为现在你不能再发送任何头了。Html响应是延迟的,这样你就知道一个页面需要哪些资源,这样你就可以添加那些响应头。由于您标记了
symfony
,似乎Controller有一个名为addLink
的方法,它可以为您完成此操作。https://symfony.com/doc/current/web_link.html#resource-hints