首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >什么是304没有修改的意思在控制台状态意味着什么?

什么是304没有修改的意思在控制台状态意味着什么?
EN

Stack Overflow用户
提问于 2015-10-12 02:47:50
回答 2查看 13.9K关注 0票数 4

我正在学习简单的聊天节点js。下面是我的示例代码:

server.js

代码语言:javascript
运行
复制
var mongo = require('mongodb').MongoClient,
    client = require('socket.io').listen(8888).sockets;

index.html

代码语言:javascript
运行
复制
<!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>

然后重新启动节点服务器,然后加载页面并检查控制台> net选项卡。

然后,我在访问socket.io时的状态是:

代码语言:javascript
运行
复制
304 Not Modified

在我的教程中应该是

代码语言:javascript
运行
复制
200 Ok

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

你能帮我做这个吗?

EN

回答 2

Stack Overflow用户

发布于 2015-10-12 04:24:58

在您的具体情况下,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响应不能包含消息体,因此始终由标题字段之后的第一个空行终止。 响应必须包括以下头字段:

  • 日期,但如第14.18.1条规定略去日期,则属例外 如果无时钟的原始服务器遵守这些规则,并且代理和客户端将自己的日期添加到没有响应的任何响应(如RFC 2068,第14.19节已经指定的那样),则缓存将正确操作。
  • ETag和/或内容-位置,如果报头在对同一请求的200个响应中发送,则缓存控制和/或更改,如果字段值可能与以前为同一变量发送的任何响应中的值不同的话。 如果条件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个响应状态和一个响应头,如下所示:

代码语言:javascript
运行
复制
 ETag: xxxxx

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

代码语言:javascript
运行
复制
If-None-Match: xxxxx

其中xxxxx在两个字符串中都是相同的字符串。

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

票数 7
EN

Stack Overflow用户

发布于 2018-03-06 19:01:52

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

我发现了以下内容--这不是为Jerielle设计的--我希望它能帮助到别人。

为了避免这个问题,只需打开以下链接(它是可选的-参见下面最后一段):

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

(请将3000换成您正在使用的)。

这将缓存socket.io.js

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

如果您再次单击refresh,它将返回304 --它可能与this有关--我猜,在此过程中使用‘If -修改’,因此刷新返回304‘未修改’。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33072519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档