使用 Google chrome 检查器 (F12) 查看下载的资源时,我注意到一条奇怪的警告消息:
注意显示临时标题
https://i.stack.imgur.com/PrUY4.jpg
我发现了一些可能相关的东西,Network Panel: add caution about provisional request headers,但我无法完全理解它。相关问题可以在 Chrome block requests 和 XMLHttpRequest cannot load. Unloaded resources show caution: Provisional headers are shown 中找到。
与 first question 类似,我的资源被阻止,但后来自动加载了相同的资源。与 second question 不同,我不想修复任何东西;我想知道这条消息的含义以及我收到它的原因。
chrome://flags/#site-isolation-trial-opt-out
该资源可能被扩展程序(在我的情况下为 AdBlock)阻止。
该消息存在是因为从未发出检索该资源的请求,因此显示的标头不是真实的。如您引用的问题中所述,服务器响应时会更新实际标头,但如果请求被阻止,则没有响应。
我发现阻止我的资源的扩展的方法是通过 Chrome 中的 net-internals 工具:
对于最新版本的 chrome
在地址栏中输入 chrome://net-export/ 并回车。
开始录制。并将录音文件保存到本地。
打开显示问题的页面。
回到网络内部
您可以在此处查看记录的日志文件 https://netlog-viewer.appspot.com/#import
单击事件 (###) 并使用文本字段查找与您的资源相关的事件(使用部分 URL)。
最后,点击事件,看看显示的信息是否告诉你一些事情。
对于旧版本的 chrome
在地址栏中输入 chrome://net-internals 并回车。
打开显示问题的页面。
返回 net-internals,单击事件 (###) 并使用文本字段查找与您的资源相关的事件(使用部分 URL)。
最后,点击事件,看看显示的信息是否告诉你一些事情。
我相信它发生在实际请求未发送时。通常在您加载缓存资源时发生。
对于 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 项目网站上提供了官方信息。
改变它有危险吗?
一个例子是网络:一旦我们有一个网络服务,我们可以选择在进程外运行它以获得更好的稳定性/安全性,或者如果我们资源有限,则在进程内运行。资源
localhost:8080
和 google.com
(!?)上都看到了这个问题。禁用站点隔离修复了 google.com,但不是 localhost。仅禁用其他两个选项可修复所有情况。
我遇到了这个问题,我设法确定了一个具体的原因,上面的答案或问题都没有提到。
我在 SSL 上运行完整的 js 堆栈、角度前端和节点后端,并且 API 位于端口 8081 上运行的不同域上,所以我正在执行 CORS 请求和 withCredentials,因为我正在从 API 中删除会话 cookie
所以特别是我的场景是:POST 请求,withCredentials 到端口 8081 导致检查器中的“注意:显示临时标头”消息,当然也一起阻止了请求。
我的解决方案是设置 apache 以代理将请求从通常的 SSL 端口 443 传递到节点 SSL 端口 8081(节点必须位于更高的端口上,因为它不能在 prod 中以 root 身份运行)。所以我猜 Chrome 不喜欢对非常规 SSL 端口的 SSL 请求,但也许他们的错误消息可能更具体。
'/graphql': { target: 'http://10.10.1.38:4000', changeOrigin: true }
"proxy": "http://192.168.98.110:1234"
添加到我的 package.json
解决了这个问题。与答案不同,我没有在 dev 的任何地方使用 HTTPS,但这是必需的,因为我的应用程序和 api 位于不同的 IP 上。
我的情况与跨域有关。
情况浏览器在发送真正的请求(如 GET
或 POST
)之前先发送 OPTIONS
请求。后端开发者忘记处理 OPTIONS
请求,让它通过服务代码,使处理时间过长。比我在 axios
初始化时写的超时设置长,也就是 5000 毫秒。所以,真正的请求发不出去,然后就遇到了provisional headers are shown
的问题。
解决方法:对于OPTIONS
请求,后端api只是返回结果,导致请求更快,并且可以在超时之前发送真正的请求。
这也可能发生(仅适用于跨域请求),因为有一个名为 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,但我仍然遇到问题。
HTTP/2 推送资源 将在检查器中生成 Provisional headers are shown
,其原理与在 his answer above 中发布的 @wvega 相同。
例如:由于服务器将资源推送给客户端(在客户端请求它们之前),浏览器缓存了资源,因此客户端永远不会发出/需要请求;所以因为...
...当服务器响应时,真正的标头会更新,但如果请求被阻止,则没有响应。
我怀疑我的回答是否能及时帮助您,但其他人可能会觉得它有帮助。我创建的 jQuery Ajax Post 脚本遇到了类似的问题。
事实证明,我用来触发帖子的 A 标记的 href 属性中有错字。我输入了 href="javacsript:;" (颠倒 's' 和 'c' ).. 这导致脚本在帖子试图触发时尝试刷新页面。纠正了错字,它对我来说非常好。
发生这种情况的一个常见原因是,如果您正在跟踪一个事件并且您没有阻止默认操作。例如,如果您有一个点击事件,那么您将希望包括:
e.preventDefault();
或者
return false;
如果不这样做,您将在 Web 控制台的“网络”选项卡中看到临时标题警告以及“已取消”状态。
当我发送无效的 HTTP 授权标头时,我遇到了这个问题。我忘了对它进行base64编码。
这可能是因为您发送了一个 Ajax 请求,同时您使用 location.href 或类似的东西将您的页面跳转到另一个页面。所以之前的请求失败了。
如果响应无效并因此被浏览器丢弃,也会出现此警告消息。
在我的情况下,请求已正确发送到服务器,然后服务器端代码产生错误,我的自定义错误处理在 HTTP 状态消息字段中返回错误消息。但是由于错误消息中的无效字符(此处描述为 http://aspnetwebstack.codeplex.com/workitem/1386)导致响应标头损坏,因此客户端未收到此错误。
我遇到了一个永远不会完成的 AJAX 调用的问题。我遵循 wvega 的建议和关于使用 chrome://net-internals
进行调试的提示,最终确定页面中的另一个 click
事件处理程序,在父节点上侦听,导致浏览器导航到相同的 URL(所以它不容易被注意到) .
解决方案是在表单提交按钮的 click
处理程序中添加 event.stopPropagation()
,以防止点击冒泡 DOM 并取消正在进行的 AJAX 请求(通过 form
上的 submit
处理程序启动)。
我最近(实际上是今天)出现了这个问题,我有一个 AJAX 调用发送到服务器,Chrome 会触发“警告:显示临时标头”。在服务器端 PHP 脚本中,有一些 MySQL 查询可能是即时的,也可能需要几秒钟,具体取决于给定的场景。在查询完成之前,我的服务器响应不会发送回浏览器。我发现只有在完成耗时的查询(总共最多几秒钟)并阻止响应被发回时,我才会收到此错误。
我的场景涉及通过添加/删除数百个列用于天气模型输出来更改表的非常罕见的可能性......因此通过 ALTER TABLE 查询循环迭代的响应滞后。
在我的情况下,它只是一个错误的资源设置路径(svg / img)
此标头显示的原因是:您的请求不发送到远程。
它通常是由
扩展程序阻止了您的请求 Chrome 使用自己的缓存来获取您的资源
Chrome 无法从尚未发出的请求中获取您的请求标头。
最新版本的 chrome 表明这些:
只有临时标头可用,因为此请求不是通过网络发送的,而是从不存储原始请求标头的本地缓存提供的。禁用缓存以查看完整的请求标头
我遇到了这个,当我从 https 切换到 http 时它就消失了。我们在开发中使用的 SSL 证书未经第三方验证。它们只是本地生成的开发证书。
相同的调用在 Chrome Canary 和 Firefox 中运行良好。这些浏览器似乎不像 Chrome 那样对 SSL 证书严格。调用将在 Chrome 中失败,并显示“注意:临时标头...”消息。
我认为/希望当我们在阶段和生产中使用合法的 SSL 证书时,我们不会再在 Chrome 中看到这种行为。
只需投入我的两分钱。我正在使用 CORS 请求和完整的 RESTful Web 服务编写 Web 应用程序。我发现当我遇到未经处理的异常或抛出 PHP 错误时,chrome 会抛出此错误。以防其他人遇到问题。我发现发生这种情况时,我可以启动 Chrome 应用程序“Postman - Rest Client”并运行完全相同的请求,但在 Chrome 应用程序中,我实际上会得到抛出的 PHP 错误,而不是这个非描述性错误。
由于 error 进行更改后,当我第二次尝试为 require js 加载 main.js 时,我遇到了这个问题。我刚刚在开发者工具设置中打开了“禁用缓存(当 DevTools 打开时)”。这就是魅力。
我见过的另一种可能的情况 - 在几毫秒后再次发送完全相同的请求(很可能是由于客户端的错误)。在这种情况下,您还会看到第一个请求的状态是“已取消”,并且延迟只有几毫秒。
这发生在我身上,当我有一个下载链接并点击它后,我也试图用 jquery 捕捉点击并发送一个 ajax 请求。问题在于,当您单击下载链接时,您将离开页面,即使看起来并非如此。如果没有文件传输,你会看到请求的页面。所以我设置了一个 target="_blank" 来防止这个问题。
当我尝试在弹出窗口中打印页面时出现此错误。打印对话框已显示,它仍在等待我在弹出窗口中接受或取消打印,而在母版页中也在后台等待显示消息警告临时标题在我尝试单击另一个链接时显示。
在我的情况下,解决方案是删除它在弹出窗口的 <body>
上执行的 window.print ();
脚本,以防止打印对话框。
当我的服务器的连接数超过 Chrome 的 max-connections-per-server 限制 6 时,我看到了这种情况。
使用您的代码的此代码拳头:
header('Cache-Control: no-cache, no-store, must-revalidate');
header('Pragma: no-cache');
header('Expires: 0');
这对我有用。
就我而言,原因是 AdBlock 扩展。
对服务器的请求通过了,我得到了响应,但由于开发工具中显示了“临时标头..”,我看不到请求 cookie。在为该站点禁用 AdBlock 后,警告消失了,开发工具再次开始显示 cookie。
为了使更改生效,还需要关闭开发工具并刷新页面
这是另一个解决方案。
如果您在调用 $ajax() 时遇到此问题,请在您的服务器主机解决您的问题之前添加 http://
。
var requestURL = "http://" + serverHost;
$.ajax({
dataType: "json",
url: requestURL,
data: data,
success: success
});
如果您正在开发 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
}
当托管在 HTTPS 上的网站调用对托管在 HTTP 上的 WebApi 的调用时,可能会显示“警告:显示临时标头”消息。如果您的所有 API 都是 HTTPS,您可以检查所有内容。浏览器阻止调用不安全的资源。当您使用 FETCH API 到带有 HTTP 的域时,您可以在代码中看到类似的消息。
混合内容:“https://website.com”处的页面是通过 HTTPS 加载的,但请求了不安全的资源“http://webapi.com”。此请求已被阻止;内容必须通过 HTTPS 提供。
我的 MEAN 应用程序也有类似的问题。就我而言,问题仅发生在一个获取请求中。我尝试删除 adblock,尝试清除缓存并尝试使用不同的浏览器。没有任何帮助。
最后,我发现 api 试图返回一个巨大的 JSON 对象。当我尝试发送一个小对象时,它工作正常。最后,我更改了实现以返回缓冲区而不是 JSON。
我希望 expressJS 在这种情况下抛出错误。