我注意到一个奇怪的警告信息,当使用谷歌chrome检查器(F12)查看下载的资源:

注意显示临时标题

我发现一些可能相关的东西,网络面板:添加临时请求头的警告,但我不能完全理解它。相关问题可以发现Chrome块请求以及XMLHttpRequest无法加载。未加载的资源显示警告:显示临时标头。

与第一个问题类似,我的资源被阻塞了,但后来自动加载了相同的资源。不像第二个问题,我不想解决任何问题;我想知道这条信息是什么意思以及我为什么收到它。


资源可能被一个扩展阻塞(在我的情况下是AdBlock)。

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


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

chrome的最新版本

在地址栏中输入chrome://net-export/,然后按enter键。 开始录音。并保存录音文件到本地。 打开显示问题的页面。 回到net-internals 您可以查看“记录日志”文件https://netlog-viewer.appspot.com/#import 点击events(###),然后使用文本框找到与你的资源相关的事件(使用部分URL)。 最后,单击事件,看看所显示的信息是否告诉了你一些东西。

chrome的旧版本

在地址栏中输入chrome://net-internals并按enter键。 打开显示问题的页面。 返回net-internals,单击events(###),并使用文本字段查找与您的资源相关的事件(使用URL的一部分)。 最后,单击事件,看看所显示的信息是否告诉了你一些东西。


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


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

我在SSL上运行一个完整的js堆栈,angular前端和节点后端,API在8081端口上运行的不同域上,所以我在做CORS请求和withCredentials,因为我正在从API中删除会话cookie

所以我的具体场景是:POST请求,带有凭据到端口8081导致“警告:临时头显示”消息在检查器中,当然也阻止了请求。

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


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

在我的例子中,请求被正确地发送到服务器,服务器端代码随后产生一个错误,我的自定义错误处理在HTTP状态消息字段中返回错误消息。但是客户端没有收到此错误,因为错误消息中的无效字符(此处描述为http://aspnetwebstack.codeplex.com/workitem/1386)导致响应报头损坏。


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

同样的调用在Chrome Canary和Firefox中也能正常运行。这些浏览器似乎不像Chrome那样严格要求SSL证书。调用将失败在Chrome与“警告:临时头…”消息。

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


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

原来,我有一个错字在一个标签的href属性,我正在使用火的帖子。我输入了href=" javacscript:;"(颠倒's'和'c')..这导致脚本在文章试图触发时尝试刷新页面。纠正了拼写错误,它为我工作得很好。


只是说说我的意见。我正在使用CORS请求和一个完全RESTful的Web服务编写一个Web应用程序。我发现chrome会抛出这个错误时,我有一个无手异常或PHP错误抛出。以防其他人遇到同样的问题。我发现当这种情况发生时,我可以启动Chrome应用程序“邮差-休息客户端”,并运行完全相同的请求,但在Chrome应用程序中,我实际上会得到被抛出的PHP错误,而不是这种非描述性错误。


这是另一个解决方案。

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

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

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

解决方案是在表单提交按钮的单击处理程序中添加event.stopPropagation(),以防止单击弹出DOM并取消正在进行的AJAX请求(通过表单上的提交处理程序发起)。


当我第二次尝试为require js加载main.js时,我运行了这个问题,因为错误导致了我的更改。 我刚刚在开发工具设置中打开了“禁用缓存(当开发工具打开时)”. 这很有魅力。


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


I've had this come up very recently (today in fact) where I've had an AJAX call go out to the server and Chrome fires off the "Caution: Provisional headers are shown." In the server side PHP scripting, there are MySQL queries that can be pretty much instant or take a few seconds depending on the given scenario. My server response isn't sent back to the browser until the queries are completed. I've found I get this error only when time consuming queries (up to a few seconds total) are being done and prevent the response from being sent back.

我的场景涉及到一个非常罕见的可能性,即必须通过添加/删除数百个天气模型输出列来更改一个表……因此,迭代ALTER TABLE查询循环会导致响应延迟。


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


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

对我来说,解决办法就是把窗户拆了。print ();它在弹出窗口的<body>上执行的脚本,以防止打印对话框。


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

e.preventDefault();

or

return false;

如果你不这样做,你会在你的web控制台的Network选项卡中看到临时头部警告以及“取消”状态。


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

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


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


HTTP/2推送资源将产生临时头显示在检查器中,与@wvega在上面的回答中发布的理论相同。

例:由于服务器将资源推送到客户端(在客户端请求它们之前),浏览器已经缓存了这些资源,因此客户端从不发出/需要请求;所以因为…

...当服务器响应时更新真实的头,但是如果请求被阻塞,则没有响应。


当我发送无效的HTTP授权报头时,发生了这个问题。我忘记用base64编码了。


当我的服务器连接数超过Chrome的每台服务器最大连接数限制6个时,我就看到了这种情况。


当托管在HTTPS上的网站调用托管在HTTP上的WebApi时,可以显示“警告:临时头部显示”消息。你可以检查所有Api是否都是HTTPS。浏览器阻止对不安全资源的调用。当使用FETCH API对HTTP进行域划分时,您可以在代码中看到类似的消息。

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


我的MEAN应用程序也有类似的问题。在我的情况下,这个问题只发生在一个get请求中。我尝试删除广告块,尝试清除缓存,并尝试与不同的浏览器。没有什么帮助。

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

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


在你的代码中使用以下代码:

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

这对我很有用。


My situation is cross-origin related. Situation: Browser sends OPTIONS request before sending the real request like GET or POST. Backend developer forgets to deal with the OPTIONS request, letting it go through the service code, making the processing time too long. Longer than the timeout setting I wrote in the axios initialization, which is 5000 milliseconds. Therefore, the real request couldn't be sent, and then I encountered the provisional headers are shown problem. Solution: When it comes to OPTIONS request, backend api just return result, it makes the request faster and the real request can be sent before timeout.


当使用一些包(如webpack-hot-middleware)并同时打开多个页面时,也会出现此问题。Webpack-hot-middleware将为每个页面创建一个连接,用于侦听代码的更改,然后刷新页面。每个浏览器都有每个服务器最大连接数限制,对于Chrome来说是6个,所以如果你已经在Chrome中打开了超过6个页面,新的请求将一直挂在那里,直到你关闭一些页面。


这种情况(仅针对跨源请求)也可能发生,因为有一种名为站点隔离的新功能

本页详细介绍了问题和解决方案。也就是去chrome://flags/#site-isolation-trial-opt-out,把这个设置改为“Opt-out”,然后重新加载chrome。

这是一个众所周知的问题。然而,该页面说它在chrome 68中是固定的,但我正在运行chrome 68,我仍然有这个问题。


这可能是因为您发送了Ajax请求,同时使用位置将页面跳转到另一个页面。Href之类的。所以之前的请求失败了。


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

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

但我写的代码是验证“b”而不是“a”


在我的案例中,原因是AdBlock扩展。

向服务器的请求通过了,我得到了响应,但由于“临时头部..”显示在Dev工具中,我无法看到请求cookie。禁用AdBlock后,警告消失了,开发工具开始再次显示cookie。

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


对于chrome v72+什么为我解决了它只是这个:

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

禁用站点隔离 启用网络服务 运行进程内网络服务

或者你可以从命令行执行:

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

为什么会发生这种情况?

谷歌似乎正在将他们的Chromium引擎重构为模块化结构,其中不同的服务将被分离为独立的模块和进程。他们把这个过程称为服务化。网络服务是第一步,接下来是Ui服务、身份服务和设备服务。谷歌提供Chromium项目站点的官方信息。

改变这一点危险吗?

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


在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>

这可能是CORS的问题。 尝试为你的api启用CORS。

为WebApi

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

这个报头显示的原因是:你的请求没有发送到远程。

它通常由

扩展已经阻止您的请求 Chrome使用自己的缓存获取您的资源

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

chrome的最新版本显示:

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


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

没有显示完整的头文件,因为有可能请求没有发送到服务器,而是直接从浏览器的缓存(例如使用service worker)提供服务


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