Что означает 304 не модифицировано в статусе консоли?

Я изучаю node js с помощью простого чата. Вот мой пример кода:

сервер.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, и когда я останавливаю весь процесс, эффект остается тем же.

Можете ли вы помочь мне с этим?


person Jerielle    schedule 12.10.2015    source источник
comment
Вы изменили index.html?   -  person Ironcache    schedule 12.10.2015
comment
Что ты имеешь в виду did you change ?   -  person Jerielle    schedule 12.10.2015
comment
304 просто означает, что сервер не считает, что ваше кешированное содержимое устарело. Это попытка оптимизации (вместо повторной отправки содержимого, он просто говорит, что то, что у вас есть в кеше, в порядке). Мне интересно, есть ли проблема на самом деле.   -  person Ironcache    schedule 12.10.2015
comment
Так 304 на самом деле не ошибка?   -  person Jerielle    schedule 12.10.2015
comment
Скорее всего, нет, если нет странной проблемы с кэшированием. Хотя, скорее всего, я ошибся насчет index.html; это, вероятно, не имеет значения, но скорее socket.io JS - это то, о чем 304. Несмотря на это, можно легко проверить, что произойдет, если вы очистите кеш; получается 200?   -  person Ironcache    schedule 12.10.2015
comment
Все тот же статус   -  person Jerielle    schedule 12.10.2015
comment
Давайте продолжим обсуждение в чате.   -  person Ironcache    schedule 12.10.2015


Ответы (2)


В вашем конкретном случае сервер 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 это фактически номер версии (поскольку код сервера хорошо знает об этом конкретном файле).

person jfriend00    schedule 12.10.2015
comment
@Jerielle - это ответило на ваш вопрос и объяснило, как все работает с 304? - person jfriend00; 15.10.2015

У меня была похожая проблема, и я сделал то, что предложил jfriend00, но это не помогло.

И я нашел следующее - это не предназначено для Jerielle - надеюсь, это кому-то поможет.

Чтобы избежать этой проблемы, просто откройте следующую ссылку (это необязательно — см. последний абзац ниже):

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

(пожалуйста, измените 3000 на то, что вы используете).

Это будет кэшировать socket.io.js

После этого откройте страницу, которую вам нужно открыть, и в первый раз вы должны получить 200. Не обновляйте страницу снова - таким образом, socket.io работает как положено - взаимодействует с сервером, как и должно (по крайней мере, в моем случае).

Если вы нажмете «Обновить», он снова вернет 304 - это может быть как-то связано с этим - что-то в этом процессе, я думаю, использует ' If-Modified-Since» и, следовательно, обновление возвращает 304 «Не изменено».

Это означает, что в большинстве случаев socket.io сможет успешно взаимодействовать с сервером, даже если вы получите 304 (даже если вы не нажмете на ссылку выше, чтобы кэшировать socket.io.js).

person Ula    schedule 06.03.2018