“小心:Chrome调试器中显示了临时标题”

时间:2014-01-17 03:38:42

标签: google-chrome http http-headers google-chrome-devtools

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

  

小心显示临时标题

enter image description here

我找到了可能相关的东西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不同,我不想修复任何东西;我想知道这条消息的含义以及收到它的原因。

36 个答案:

答案 0 :(得分:306)

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

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


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

  • 在地址栏中输入chrome://net-internals,然后按Enter键。
  • 打开显示问题的页面。
  • 返回net-internals,点击事件(###)并使用文本字段查找与您的资源相关的事件(使用网址的部分内容)。
  • 最后,点击该活动,看看显示的信息是否告诉你了什么。

答案 1 :(得分:99)

我相信在没有发送实际请求时会发生这种情况。通常在加载缓存资源时发生。

答案 2 :(得分:22)

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

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

具体来说,我的方案是:POST请求,withCredentials到端口8081导致检查器中出现“小心:显示临时标题”消息,当然也阻止了所有请求。

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

答案 3 :(得分:11)

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

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

  

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

答案 4 :(得分:11)

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

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

  • 禁用网站隔离
  • 启用网络服务
  • 在运行网络服务

enter image description here

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

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

为什么会这样?

  

似乎Google会将其Chromium引擎重构为模块化结构,其中不同的服务将分为独立的模块和流程。他们称此过程为服务化。网络服务是第一步,即将推出Ui服务,身份服务和设备服务。 Google在Chromium project site上提供了官方信息。

更改它是否很危险?

  

一个例子是联网:一旦有了网络服务,我们可以选择将其运行在进程外以提高稳定性/安全性,如果资源有限则在运行中source

答案 5 :(得分:9)

由于一个名为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,但仍然有问题。

答案 6 :(得分:8)

我的情况是来源相关 情境:在发送OPTIONSGET等真实请求之前,浏览器会发送POST请求。后端开发人员忘记处理OPTIONS请求,让它通过服务代码,使处理时间过长。比我在axios初始化中写的超时设置长,这是5000毫秒。因此,无法发送真实请求,然后我遇到了provisional headers are shown问题 解决方案:当涉及OPTIONS请求时,后端api只返回结果,它会使请求更快,并且可以在超时之前发送实际请求。

答案 7 :(得分:6)

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

事实证明我在用于解雇帖子的A标签的href属性中输入了一个拼写错误。我输入了href =“ javacsript :;” (反转's'和'c')..这导致脚本在帖子试图触发时尝试刷新页面。纠正了错字,它对我来说非常好。

答案 8 :(得分:4)

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

答案 9 :(得分:2)

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

答案 10 :(得分:2)

我最近(事实上今天)已经出现了这个问题,我已经向服务器发出了一个AJAX呼叫,而Chrome则触发了"警告:显示临时标题。 "在服务器端PHP脚本中,有几个MySQL查询可以是非常即时的,或者需要几秒钟,具体取决于给定的场景。在查询完成之前,我的服务器响应不会被发送回浏览器。我发现只有在耗时的查询(总共几秒钟)完成后才会收到此错误,并阻止响应被发回。

我的场景涉及通过添加/删除数百个天气模型输出列来改变表格的极少数可能性...因此,迭代通过ALTER TABLE查询循环的响应滞后。

答案 11 :(得分:2)

我遇到了一个永远无法完成的AJAX调用。我遵循了wvega的建议并提示调试chrome://net-internals以最终确定页面中的另一个click事件处理程序,监听父节点,导致浏览器导航到同一个URL(所以它不是'很容易注意到。)

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

答案 12 :(得分:2)

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

e.preventDefault();

return false;

如果你没有,你会看到临时标题警告以及"取消"在Web控制台的“网络”选项卡中显示状态。

答案 13 :(得分:2)

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

答案 14 :(得分:2)

当我发送无效的HTTP授权标头时,我遇到此问题。我忘了base64编码了。

答案 15 :(得分:1)

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

答案 16 :(得分:1)

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

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

答案 17 :(得分:1)

使用此代码的代码:

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

这适合我。

答案 18 :(得分:1)

我看到当我的服务器的连接数超过Chrome的每服务器最大连接数限制为6时就会发生这种情况。

答案 19 :(得分:1)

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

同样的调用在Chrome Canary和Firefox中运行得很好。这些浏览器似乎不像Chrome那样严格控制SSL证书。使用“注意:临时标题...”消息,Chrome中的调用将失败。

我认为/希望当我们在舞台和prod中使用合法的SSL证书时,我们将不再在Chrome中看到此行为。

答案 20 :(得分:1)

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

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

答案 21 :(得分:1)

这发生在我身上,当我有一个下载链接并点击它之后我还试图用jquery捕获点击并发送一个ajax请求。问题是因为当您点击下载链接时,您将离开该页面,即使它看起来不是这样。如果没有文件传输,你会看到请求的页面..所以我设置了一个target =“_ blank”来防止这个问题。

答案 22 :(得分:1)

当我因为错误而进行更改后第二次尝试为require js加载main.js时,我遇到了这个问题。 我刚刚在开发人员工具设置&#34;禁用缓存(当DevTools打开时)&#34; 。 那就是魅力。

答案 23 :(得分:0)

我在 WordPress 中使用了 LiteSpeed 缓存插件。在那里,我启用了浏览器缓存。禁用此功能对我有用。然后,后来我启用它以提高性能。

答案 24 :(得分:0)

这可能是CORS问题。 尝试为您的API启用CORS。

对于WebApi

  var cors = new EnableCorsAttribute("*", "*", "*");
            config.EnableCors(cors);

答案 25 :(得分:0)

在AJAX URL属性中发送参数时遇到了这个问题  http://10.165.10.160:82/services?param1=xxxx&param2=xxxx

如果要执行get请求(例如,发送参数化的url),不要将其添加到url属性中,而是在数据对象中添加

        <script>
        $.ajax({
        url: "http://10.160.10.160:82/services/STD_ERROR.php",
        data: {
            StatusText: StatusText,
            Status: Status,
            UserCode: UserCode,
            FUNC_CODE: FuncCode,
            ErrorDescription: ErrorDescription
        },
        type: "GET",
        crossDomain: true,
        cache: false
    }).done(data => {
        console.log(data)
    }).fail(function(xhr, status, error) {
        console.log(xhr.ErrorDescription)
    });
</script>

答案 26 :(得分:0)

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

通常是由

引起的
  1. 扩展名阻止了您的请求
  2. Chrome浏览器使用自己的缓存来获取资源

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

最新版的chrome可以表明这些:

只有临时标头可用,因为此请求不是通过网络发送的,而是由本地缓存提供的, 不会存储原始请求标头。

禁用缓存以查看完整的请求标头

答案 27 :(得分:0)

尝试使用ctrl + shift + F5重新加载页面,然后再次检查请求标头

完整的标头未显示,因为有可能请求不会发送到服务器,而是直接从浏览器的缓存中提供服务,例如使用服务工作者

答案 28 :(得分:0)

在我的情况下,原因是AdBlock扩展。

对服务器的请求通过了,我得到了响应,但是由于开发工具中显示“ Provisional headers ..”,所以我看不到请求cookie。在为网站禁用AdBlock后,警告消失了,开发工具开始再次显示cookie。

要使更改生效,还必须关闭开发工具并刷新页面

答案 29 :(得分:0)

使用webpack-hot-middleware之类的某些程序包并同时打开多个页面时,也会发生此问题。 webpack-hot-middleware将为每个页面创建一个连接,以侦听代码更改,然后刷新页面。每个浏览器都有一个max-connections-per-server限制,Chrome浏览器限制为6,因此,如果您已经在Chrome浏览器中打开了6个以上的页面,则新请求将被挂在那里,直到您关闭某些页面为止。

答案 30 :(得分:0)

我的MEAN应用程序遇到了类似的问题。在我的情况下,问题只发生在一个get请求中。我尝试删除adblock,尝试清除缓存并尝试使用不同的浏览器。什么都没有帮助。

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

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

答案 31 :(得分:0)

“注意:显示临时标题”当在HTTPS上托管的网站调用对HTTP上托管的WebApi的调用时,可以显示该消息。如果您的所有Api都是HTTPS,您可以检查所有。浏览器阻止对不安全的资源进行调用。将FETCH API用于使用HTTP的域时,您可以在代码中看到类似的消息。

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

答案 32 :(得分:0)

如果您正在开发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
}

答案 33 :(得分:0)

这是另一种解决方案。

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

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

答案 34 :(得分:0)

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

答案 35 :(得分:-1)

在我的情况下,我是在post请求中发送的主体参数,而我根据主体参数编写的逻辑是错误的,因此无法发送响应。所以我遇到了这个错误。

 example: post request body (a: alsldfjfj) which I was sending

但是我已经编写了用于验证“ b”而不是“ a”的代码