Chromium内核浏览器无协议URL请求3秒后重发问题咨询
相关但非重复问题:Chrome在3秒后取消URL_REQUEST请求
=> 该问题被错误标记为已解决,本文补充新信息以探究原因。
核心总结与问题:
当访问未携带http(s)://协议的URL时,Chromium内核浏览器会取消耗时超过3秒的请求并重新发起一次,导致服务器收到两次请求(详见下方详细日志)。
- a) 是否有办法修改该行为?
即能否让Chromium内核浏览器“等待更长时间”,而非取消请求后重发。 - b) 如何处理或避免该问题?(当然,除了优化URL性能之外)
发现与总结:
- 该问题仅出现在Chromium内核浏览器中(如Google Chrome、Microsoft Edge等)
- 仅当访问未指定协议(scheme)
http://或https://的URL时才会出现 - 无论域名是否配置
http->https重定向,该问题都会发生(详见下方详细日志) - 该问题与HSTS无关:测试显示启用HSTS后,Chrome仅会将301/302的
http->https重定向替换为307内部重定向 - 该问题在HTTP/1和HTTP2协议下均会出现(已在两台不同服务器测试)
- 仅当初始请求耗时至少3秒时才会出现该问题
详细日志:
1. 全局虚拟主机未配置HTTP => HTTPS重定向

# Apache日志 [24/May/2024:15:35:54] 1.2.3.4 - www.example.com:443 "GET /testing HTTP/1.1" 200 "www.example.com/testing" bytes:34 time:4042159 [24/May/2024:15:35:57] 1.2.3.4 - www.example.com:80 "GET /testing HTTP/1.1" 200 "www.example.com/testing" bytes:34 time:4027890 [24/May/2024:15:36:01] 1.2.3.4 - www.example.com:80 "GET /favicon.ico HTTP/1.1" 200 "www.example.com/favicon.ico" bytes:0 time:326 # PHP日志 [2024-05-24 15:35:54.478306] 1.2.3.4 local.INFO: [REQUESTED_AT_15:35:54.477500] [https://www.example.com/testing] Request received, now I will wait 4 s [2024-05-24 15:35:57.290657] 1.2.3.4 local.INFO: [REQUESTED_AT_15:35:57.290000] [http://www.example.com/testing] Request received, now I will wait 4 s [2024-05-24 15:35:58.478763] 1.2.3.4 local.INFO: [REQUESTED_AT_15:35:54.477500] [https://www.example.com/testing] Done, I waited 4 s! It is now 15:35:58.478700 [2024-05-24 15:36:01.291083] 1.2.3.4 local.INFO: [REQUESTED_AT_15:35:57.290000] [http://www.example.com/testing] Done, I waited 4 s! It is now 15:36:01.291000
如您所见,15:35:54发送的请求尚未完成,但Chrome已发送另一个请求,导致服务器收到两次请求(可能引发重复操作等问题)。
2. 全局虚拟主机已配置HTTP => HTTPS重定向

# Apache日志 [24/May/2024:15:53:25] 1.2.3.4 - www.example.com:443 "GET /testing HTTP/1.1" 200 "www.example.com/testing" bytes:34 time:4244717 [24/May/2024:15:53:28] 1.2.3.4 - www.example.com:443 "GET /testing HTTP/1.1" 200 "www.example.com/testing" bytes:34 time:4040528 [24/May/2024:15:53:32] 1.2.3.4 - www.example.com:443 "GET /favicon.ico HTTP/1.1" 200 "www.example.com/favicon.ico" bytes:0 time:364 # PHP日志 [2024-05-24 15:53:25.953574] 1.2.3.4 local.INFO: [REQUESTED_AT_15:53:25.948300] [https://www.example.com/testing] Request received, now I will wait 4 s [2024-05-24 15:53:28.739584] 1.2.3.4 local.INFO: [REQUESTED_AT_15:53:28.738700] [https://www.example.com/testing] Request received, now I will wait 4 s [2024-05-24 15:53:29.954046] 1.2.3.4 local.INFO: [REQUESTED_AT_15:53:25.948300] [https://www.example.com/testing] Done, I waited 4 s! It is now 15:53:29.954000 [2024-05-24 15:53:32.740055] 1.2.3.4 local.INFO: [REQUESTED_AT_15:53:28.738700] [https://www.example.com/testing] Done, I waited 4 s! It is now 15:53:32.739900
最小复现示例(MRE):
- 打开Chromium内核浏览器
- 打开开发者工具的Network标签
- 粘贴“慢”URL,不带
http://或https://(例如:www.example.net/) - 按下回车键,确认以下行为:
- 发送第一个请求
- 3秒后,浏览器取消该请求并重新发起一个请求
(以下是Laravel代码,但普通PHP也能复现该问题)
<?php Route::get('/testing', function () { $u = url()->full(); $s = 4; $now = DateTime::createFromFormat('U.u', microtime(true)); $t = $now->format("H:i:s.u"); Log::info("[REQUESTED_AT_$t] [$u] Request received, now I will wait $s s"); sleep($s); $now = DateTime::createFromFormat('U.u', microtime(true)); $t2 = $now->format("H:i:s.u"); Log::info("[REQUESTED_AT_$t] [$u] Done, I waited $s s! It is now $t2"); echo "Page loaded, OK"; });
无需真实“慢”URL,只需限制网络速度即可复现该问题。
内容的提问来源于stack exchange,提问作者4wk_
相关产品推荐
相关产品推荐

