ChatGPT解决这个技术问题 Extra ChatGPT

Chrome 调试器中的“注意:显示临时标头”

使用 Google chrome 检查器 (F12) 查看下载的资源时,我注意到一条奇怪的警告消息:

注意显示临时标题

https://i.stack.imgur.com/PrUY4.jpg

我发现了一些可能相关的东西,Network Panel: add caution about provisional request headers,但我无法完全理解它。相关问题可以在 Chrome block requestsXMLHttpRequest cannot load. Unloaded resources show caution: Provisional headers are shown 中找到。

first question 类似,我的资源被阻止,但后来自动加载了相同的资源。与 second question 不同,我不想修复任何东西;我想知道这条消息的含义以及我收到它的原因。

如果由于域切换而没有发送请求,例如通过 ajax 从 www.domain.tld 发送数据到 domain.tld 或反之亦然,也会出现此问题。
@wvega 在此 SO question 中发布了一个类似的问题,但似乎没有任何可能解释此 Provisional Headers Sent 问题。有什么具体的解决方案吗?真烦人!我之前发布过这个问题。
@webblover wvega 有一个很好的解释。我实际上并不是在寻找解决方案。我很好奇一个原因。
当我关闭它时它对我有帮助:chrome://flags/#site-isolation-trial-opt-out
阅读我的答案,它并不像看起来那么复杂:stackoverflow.com/questions/21177387/…

R
Ravi

该资源可能被扩展程序(在我的情况下为 AdBlock)阻止。

该消息存在是因为从未发出检索该资源的请求,因此显示的标头不是真实的。如您引用的问题中所述,服务器响应时会更新实际标头,但如果请求被阻止,则没有响应。

我发现阻止我的资源的扩展的方法是通过 Chrome 中的 net-internals 工具:

对于最新版本的 chrome

在地址栏中输入 chrome://net-export/ 并回车。

开始录制。并将录音文件保存到本地。

打开显示问题的页面。

回到网络内部

您可以在此处查看记录的日志文件 https://netlog-viewer.appspot.com/#import

单击事件 (###) 并使用文本字段查找与您的资源相关的事件(使用部分 URL)。

最后,点击事件,看看显示的信息是否告诉你一些事情。

对于旧版本的 chrome

在地址栏中输入 chrome://net-internals 并回车。

打开显示问题的页面。

返回 net-internals,单击事件 (###) 并使用文本字段查找与您的资源相关的事件(使用部分 URL)。

最后,点击事件,看看显示的信息是否告诉你一些事情。


沙兹的回答更好。每当从浏览器的缓存中检索资源时,您会在调试器中看到此消息,而无需询问服务器内容是否已更改。
我认为这两个答案都是正确的,它们讲述了同一个故事的两个方面。当请求被阻止或从缓存中加载资源时,以及在每个请求启动后以及浏览器等待来自服务器的响应时,都会显示该消息。一旦响应到达,消息就会消失并显示真实的标题。
如果主要分析的页面被重定向,例如 example.com/a ->301->example.com/b,并且目标页面回答为 200,然后您在检查器中单击目标页面 /b 以查看标题数据,您将获得它们,并标有“显示临时标题”。这是正确的,因为您没有直接分析目标页面。如果你这样做,你会得到没有标签的标题数据。
我能够确定这是我的问题,因为当我执行上述操作时。我的 https 站点正在调用一个 https css 文件,该文件正在执行 302 重定向到 http 页面。安全不允许文件加载,只显示临时标题。
对于可能发生这种情况的多种原因,有一个很好的解释:stackoverflow.com/questions/12009423/…
S
Shazz

我相信它发生在实际请求未发送时。通常在您加载缓存资源时发生。


不,304 not modified 来自服务器以响应条件请求。如果您正在加载缓存资源并且您的浏览器不必联系服务器,您将不会得到 304 未修改或任何 HTTP 状态,因为不会发出 HTTP 请求。
这对我有用,当我在调试器面板中看到“显示临时标头”时,请求的状态代码是“200 OK(来自缓存)”
我在服务人员响应中看到了这一点,所以我认为至少在某些情况下,您对缓存响应是正确的 :)
我在开发工具中关闭了缓存,但仍然收到此消息。所有文件的状态都是 200,没有“(来自缓存)”。所以有时可能是由于缓存,但肯定不总是。
就我而言,它正在从缓存中加载数据。
B
Badr Elmers

对于 chrome v72+,为我解决的只是这个:

转到 chrome://flags/ 并禁用这 3 个标志

禁用站点隔离

启用网络服务

在进程中运行网络服务

https://i.stack.imgur.com/x57Wz.png

或者您可以从命令行执行此操作:

chrome --disable-site-isolation-trials --disable-features=NetworkService,NetworkServiceInProcess

为什么会这样?

谷歌似乎正在将他们的 Chromium 引擎重构为模块化结构,其中不同的服务将被分成独立的模块和进程。他们称之为过程服务化。网络服务是第一步,Ui 服务、Identity 服务和 Device 服务都来了。谷歌在 Chromium 项目网站上提供了官方信息。

改变它有危险吗?

一个例子是网络:一旦我们有一个网络服务,我们可以选择在进程外运行它以获得更好的稳定性/安全性,或者如果我们资源有限,则在进程内运行。资源


我可以通过“启用网络服务”和“在进程中运行网络服务”来实现这一点。
我只是禁用了站点隔离,这对我有用。
这在常规 Chrome (v74) 中有效,但是最新版本的 Chrome Canary (v76) 现在缺少“#network-service”标志......没有它就无法在 Canary 中工作。
我在 localhost:8080google.com(!?)上都看到了这个问题。禁用站点隔离修复了 google.com,但不是 localhost。仅禁用其他两个选项可修复所有情况。
我只需要关闭它:chrome://flags/#site-isolation-trial-opt-out
M
Mister P

我遇到了这个问题,我设法确定了一个具体的原因,上面的答案或问题都没有提到。

我在 SSL 上运行完整的 js 堆栈、角度前端和节点后端,并且 API 位于端口 8081 上运行的不同域上,所以我正在执行 CORS 请求和 withCredentials,因为我正在从 API 中删除会话 cookie

所以特别是我的场景是:POST 请求,withCredentials 到端口 8081 导致检查器中的“注意:显示临时标头”消息,当然也一起阻止了请求。

我的解决方案是设置 apache 以代理将请求从通常的 SSL 端口 443 传递到节点 SSL 端口 8081(节点必须位于更高的端口上,因为它不能在 prod 中以 root 身份运行)。所以我猜 Chrome 不喜欢对非常规 SSL 端口的 SSL 请求,但也许他们的错误消息可能更具体。


这就是浏览器的同源策略——你的网页和你正在阅读的资源必须在同一个端口上。 developer.mozilla.org/en-US/docs/Web/Security/…
非常感谢您的帮助。我正在使用 webpacks 开发服务器,我能够添加一个重写规则。 '/graphql': { target: 'http://10.10.1.38:4000', changeOrigin: true }
同样,我通过在 create-react-app 项目中将 "proxy": "http://192.168.98.110:1234" 添加到我的 package.json 解决了这个问题。与答案不同,我没有在 dev 的任何地方使用 HTTPS,但这是必需的,因为我的应用程序和 api 位于不同的 IP 上。
A
Alessia

我的情况与跨域有关。
情况浏览器在发送真正的请求(如 GETPOST)之前先发送 OPTIONS 请求。后端开发者忘记处理 OPTIONS 请求,让它通过服务代码,使处理时间过长。比我在 axios 初始化时写的超时设置长,也就是 5000 毫秒。所以,真正的请求发不出去,然后就遇到了provisional headers are shown的问题。
解决方法:对于OPTIONS请求,后端api只是返回结果,导致请求更快,并且可以在超时之前发送真正的请求。


j
jakub.g

这也可能发生(仅适用于跨域请求),因为有一个名为 site isolation 的新功能

This page details the issue and a work-around。在 chrome 中转到 chrome://flags/#site-isolation-trial-opt-out 并将该设置更改为“退出”并重新加载 chrome。

这是一个known issue。但是该页面说它已在 chrome 68 中修复,但我正在运行 chrome 68,但我仍然遇到问题。


如果您的请求没有被阻止(200 OK),它只发生在 CORS 请求中,并且缺少的标头是 Cookie,您想要检查这个答案。谢谢,@onlynone
@semako,您能更详细地解释一下吗?我遇到了类似的问题,但我不完全明白为什么。有关更多信息,请参阅我最近的帖子。谢谢你。
C
Community

HTTP/2 推送资源 将在检查器中生成 Provisional headers are shown,其原理与在 his answer above 中发布的 @wvega 相同。

例如:由于服务器将资源推送给客户端(在客户端请求它们之前),浏览器缓存了资源,因此客户端永远不会发出/需要请求;所以因为...

...当服务器响应时,真正的标头会更新,但如果请求被阻止,则没有响应。


S
Savage

我怀疑我的回答是否能及时帮助您,但其他人可能会觉得它有帮助。我创建的 jQuery Ajax Post 脚本遇到了类似的问题。

事实证明,我用来触发帖子的 A 标记的 href 属性中有错字。我输入了 href="javacsript:;" (颠倒 's' 和 'c' ).. 这导致脚本在帖子试图触发时尝试刷新页面。纠正了错字,它对我来说非常好。


遇到了同样的问题,没有错字,但我有一个脚本在 POST 被触发/完成之前重新加载页面。
d
dionyziz

当网站使用 HSTS 保护时,可能会出现此消息。然后,当有人链接到 URL 的 HTTP 版本时,浏览器按照 HSTS 的指示,不会发出 HTTP 请求,而是在内部安全地重定向到 HTTPS 资源。这是为了避免 HTTPS 降级攻击,例如 sslstrip


我禁用了 HSTS,原始标题再次出现。谢谢!
我使用 http:// 测试我的网站,效果很好。现在我使用 https:// 测试它,然后它无法加载一些资源。最后发现资源的url应该改成https了。
b
bigtex777

发生这种情况的一个常见原因是,如果您正在跟踪一个事件并且您没有阻止默认操作。例如,如果您有一个点击事件,那么您将希望包括:

e.preventDefault();

或者

return false;

如果不这样做,您将在 Web 控制台的“网络”选项卡中看到临时标题警告以及“已取消”状态。


R
Robert Christopher

当我发送无效的 HTTP 授权标头时,我遇到了这个问题。我忘了对它进行base64编码。


我的情况是授权标头太长
F
Frankjs

这可能是因为您发送了一个 Ajax 请求,同时您使用 location.href 或类似的东西将您的页面跳转到另一个页面。所以之前的请求失败了。


F
Florian Haider

如果响应无效并因此被浏览器丢弃,也会出现此警告消息。

在我的情况下,请求已正确发送到服务器,然后服务器端代码产生错误,我的自定义错误处理在 HTTP 状态消息字段中返回错误消息。但是由于错误消息中的无效字符(此处描述为 http://aspnetwebstack.codeplex.com/workitem/1386)导致响应标头损坏,因此客户端未收到此错误。


j
jimp

我遇到了一个永远不会完成的 AJAX 调用的问题。我遵循 wvega 的建议和关于使用 chrome://net-internals 进行调试的提示,最终确定页面中的另一个 click 事件处理程序,在父节点上侦听,导致浏览器导航到相同的 URL(所以它不容易被注意到) .

解决方案是在表单提交按钮的 click 处理程序中添加 event.stopPropagation(),以防止点击冒泡 DOM 并取消正在进行的 AJAX 请求(通过 form 上的 submit 处理程序启动)。


G
Gwi7d31

我最近(实际上是今天)出现了这个问题,我有一个 AJAX 调用发送到服务器,Chrome 会触发“警告:显示临时标头”。在服务器端 PHP 脚本中,有一些 MySQL 查询可能是即时的,也可能需要几秒钟,具体取决于给定的场景。在查询完成之前,我的服务器响应不会发送回浏览器。我发现只有在完成耗时的查询(总共最多几秒钟)并阻止响应被发回时,我才会收到此错误。

我的场景涉及通过添加/删除数百个列用于天气模型输出来更改表的非常罕见的可能性......因此通过 ALTER TABLE 查询循环迭代的响应滞后。


PHP Workers 可能适合你
t
typocoder

在我的情况下,它只是一个错误的资源设置路径(svg / img)


是的 - 对我来说,使用文件输入请求时缺少权限。
n
nuclear

此标头显示的原因是:您的请求不发送到远程。

它通常是由

扩展程序阻止了您的请求 Chrome 使用自己的缓存来获取您的资源

Chrome 无法从尚未发出的请求中获取您的请求标头。

最新版本的 chrome 表明这些:

只有临时标头可用,因为此请求不是通过网络发送的,而是从不存储原始请求标头的本地缓存提供的。禁用缓存以查看完整的请求标头


C
CodeWarrior

我遇到了这个,当我从 https 切换到 http 时它就消失了。我们在开发中使用的 SSL 证书未经第三方验证。它们只是本地生成的开发证书。

相同的调用在 Chrome Canary 和 Firefox 中运行良好。这些浏览器似乎不像 Chrome 那样对 SSL 证书严格。调用将在 Chrome 中失败,并显示“注意:临时标头...”消息。

我认为/希望当我们在阶段和生产中使用合法的 SSL 证书时,我们不会再在 Chrome 中看到这种行为。


我试图卷曲,并收到 60。从这个答案中找出 SSL 安装时缺少的链。添加链和问题消失了。多谢,伙计!请使用它来检查: curl -s -D- https://
J
JDubDev

只需投入我的两分钱。我正在使用 CORS 请求和完整的 RESTful Web 服务编写 Web 应用程序。我发现当我遇到未经处理的异常或抛出 PHP 错误时,chrome 会抛出此错误。以防其他人遇到问题。我发现发生这种情况时,我可以启动 Chrome 应用程序“Postman - Rest Client”并运行完全相同的请求,但在 Chrome 应用程序中,我实际上会得到抛出的 PHP 错误,而不是这个非描述性错误。


O
Ohad Sadan

由于 error 进行更改后,当我第二次尝试为 require js 加载 main.js 时,我遇到了这个问题。我刚刚在开发者工具设置中打开了“禁用缓存(当 DevTools 打开时)”。这就是魅力。


刚刚有一个类似的问题,当 Chrome 开发工具打开时,html5 视频不会加载,因为我保持启用“禁用缓存(当 DevTools 打开时)”。禁用设置解决了这个问题。
E
Erez Cohen

我见过的另一种可能的情况 - 在几毫秒后再次发送完全相同的请求(很可能是由于客户端的错误)。在这种情况下,您还会看到第一个请求的状态是“已取消”,并且延迟只有几毫秒。


H
Hayk Aghabekyan

这发生在我身上,当我有一个下载链接并点击它后,我也试图用 jquery 捕捉点击并发送一个 ajax 请求。问题在于,当您单击下载链接时,您将离开页面,即使看起来并非如此。如果没有文件传输,你会看到请求的页面。所以我设置了一个 target="_blank" 来防止这个问题。


A
Arnau Galofré

当我尝试在弹出窗口中打印页面时出现此错误。打印对话框已显示,它仍在等待我在弹出窗口中接受或取消打印,而在母版页中也在后台等待显示消息警告临时标题在我尝试单击另一个链接时显示。

在我的情况下,解决方案是删除它在弹出窗口的 <body> 上执行的 window.print (); 脚本,以防止打印对话框。


m
mab

当我的服务器的连接数超过 Chrome 的 max-connections-per-server 限制 6 时,我看到了这种情况。


N
Nabi K.A.Z.

使用您的代码的此代码拳头:

header('Cache-Control: no-cache, no-store, must-revalidate');
header('Pragma: no-cache');
header('Expires: 0');

这对我有用。


T
Tarmo

就我而言,原因是 AdBlock 扩展。

对服务器的请求通过了,我得到了响应,但由于开发工具中显示了“临时标头..”,我看不到请求 cookie。在为该站点禁用 AdBlock 后,警告消失了,开发工具再次开始显示 cookie。

为了使更改生效,还需要关闭开发工具并刷新页面


K
KTU

这是另一个解决方案。

如果您在调用 $ajax() 时遇到此问题,请在您的服务器主机解决您的问题之前添加 http://

var requestURL = "http://" + serverHost;
$.ajax({
    dataType: "json",
    url: requestURL,
    data: data,
    success: success    
});

c
codingbiz

如果您正在开发 Asp.Net Mvc 应用程序并尝试在控制器中返回 JsonResult,请确保将 JsonRequestBehavior.AllowGet 添加到 Json 方法。那为我修好了。

public JsonResult GetTaskSubCategories(int id)
{
    var subcategs = FindSubCategories(id);

    return Json(subcategs, JsonRequestBehavior.AllowGet);  //<-- Notice it has two parameters
}

R
Rafal Cypcer

当托管在 HTTPS 上的网站调用对托管在 HTTP 上的 WebApi 的调用时,可能会显示“警告:显示临时标头”消息。如果您的所有 API 都是 HTTPS,您可以检查所有内容。浏览器阻止调用不安全的资源。当您使用 FETCH API 到带有 HTTP 的域时,您可以在代码中看到类似的消息。

混合内容:“https://website.com”处的页面是通过 HTTPS 加载的,但请求了不安全的资源“http://webapi.com”。此请求已被阻止;内容必须通过 HTTPS 提供。


c
chank

我的 MEAN 应用程序也有类似的问题。就我而言,问题仅发生在一个获取请求中。我尝试删除 adblock,尝试清除缓存并尝试使用不同的浏览器。没有任何帮助。

最后,我发现 api 试图返回一个巨大的 JSON 对象。当我尝试发送一个小对象时,它工作正常。最后,我更改了实现以返回缓冲区而不是 JSON。

我希望 expressJS 在这种情况下抛出错误。