304未修改意味着在控制台状态中意味着什么?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了304未修改意味着在控制台状态中意味着什么?相关的知识,希望对你有一定的参考价值。

我正在通过简单的聊天来学习节点js。这是我的示例代码:

server.js

var mongo = require('mongodb').MongoClient,
    client = require('socket.io').listen(8888).sockets;

的index.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Node Chat System</title>
        <link rel="stylesheet" type="text/css" href="css/main.css" />
    </head>
    <body>
        <div class="chat">
            <input type="text" class="chat-name" placeholder="Enter your name" />
            <div class="chat-messages"></div>
            <textarea placeholder="Enter your message" ></textarea>
            <div class="chat-status">Status: <span>Idle</span></div>
            <script src="http://127.0.0.1:8888/socket.io/socket.io.js"></script>
        </div>
    </body>
</html>

然后我重新启动节点服务器然后加载我的页面并检查控制台>网络选项卡

然后我访问socket.io的状态是这样的:

304 Not Modified

在我的教程中它应该是

200 Ok

顺便说一句,我也使用wampserver,当我停止所有进程仍然是相同的效果。

你能帮帮我吗?

答案

在您的特定情况下,node.js服务器只是告诉浏览器它的缓存版本的socket.io.js没有过时,所以只需使用缓存中已有的版本。这是可缓存文件的正常预期浏览器行为。如果清除浏览器缓存,重新启动浏览器,然后重复此测试,第一次加载文件时,应该看到200状态(由于缓存为空,浏览器不会发出条件GET请求)。之后,一旦文件被缓存,你应该再次获得304。


304返回状态的描述就在规范中(也是Google搜索中的第一个结果):

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.5

10.3.5 304未修改

如果客户端已执行条件GET请求并允许访问,但文档尚未修改,则服务器应该响应此状态代码。 304响应必须不包含消息体,因此总是在头字段之后的第一个空行终止。

响应必须包括以下标头字段:

  - Date, unless its omission is required by section 14.18.1 

如果无时钟源服务器遵守这些规则,并且代理和客户端将自己的日期添加到没有接收到的任何响应(如[RFC 2068]第14.19节所述),则高速缓存将正常运行。

  - ETag and/or Content-Location, if the header would have been sent
    in a 200 response to the same request
  - Expires, Cache-Control, and/or Vary, if the field-value might
    differ from that sent in any previous response for the same
    variant 

如果条件GET使用强缓存验证器(参见第13.3.3节),则响应不应包括其他实体头。否则(即,条件GET使用弱验证器),响应绝不能包括其他实体头;这可以防止缓存的实体主体和更新的标头之间的不一致。

如果304响应指示当前未缓存的实体,则缓存必须忽略响应并在没有条件的情况下重复请求。

如果高速缓存使用接收的304响应来更新高速缓存条目,则高速缓存必须更新该条目以反映响应中给出的任何新字段值。

因此,简而言之,这意味着如果客户端执行了条件GET请求,那么服务器可以返回304,这意味着内容自上次请求后未被修改,这是服务器将其传达回到客户端没有再次发回内容。基本上,客户说“我想知道你是否有这个内容的更新版本,这里是我已经拥有的版本的元数据。如果你没有比我已有的更新的版本,那么只是返回304,否则发送给我更新的版本“。

而且,如果您想要对“条件GET请求”进行更多解释,可以在这里阅读:https://ruturajv.wordpress.com/2005/12/27/conditional-get-request/


更多详情

如果清除浏览器缓存然后获取socket.io.js,您将看到200响应状态和响应头,如下所示:

 ETag: xxxxx

然后,下次浏览器请求同一个文件时,它会在请求中发送带有此标头的条件GET请求:

If-None-Match: xxxxx

其中xxxxx与两者中的字符串相同。

这是浏览器告诉服务器它已经有一个给定ETag的这个文件的版本。然后服务器检查文件的版本是否是ETag。如果ETag匹配,则返回304.在这种情况下,ETag用作版本号。在某些情况下,它是文件的散列,但在socket.io.js的特定情况下,它实际上是一个版本号(因为服务器代码非常了解该特定文件)。

另一答案

我有类似的问题,我做了jfriend00建议,但它没有帮助。

我发现了以下内容 - 它不适用于Jerielle - 我希望它能帮到某个人。

要避免此问题,只需打开以下链接(可选 - 请参阅下面的最后一段):

http://localhost:3000/socket.io/socket.io.js

(请将3000更改为您正在使用的)。

这将缓存socket.io.js

之后打开你需要打开的页面,第一次你应该得到200.不要再刷新页面 - 这样socket.io按预期工作 - 与服务器通信(至少在我的情况下)。

如果你点击刷新它再次返回304 - 它可能与this有关 - 在这个过程中,我猜,使用'If-Modified-Since',因此刷新返回304'未修改'。

这意味着在大多数情况下,即使你得到304,socket.io也应该能够成功地与服务器通信(即使你没有点击上面的链接来缓存socket.io.js)。

以上是关于304未修改意味着在控制台状态中意味着什么?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 304 状态码算作“重定向”?

Chrome etag 总是显示 200 ok 但 curl 得到 304 未修改

为啥在使用 HttpWebRequest 时某些链接上出现“(304)未修改”错误?

深入浅出Flask:服务器输出304代表什么

expires_in max-age 缓存控制不起作用

HTTP 状态消息 200 302 304 403 404 500 分别表示啥?