MSIE/Edge использует HTTP HEAD для URL-адресов данных <object>, а затем воспринимает ответ 204 как ошибку?

Фон:

Мой PHP-код обрабатывает типичные запросы HTTP HEAD, отправляя либо ответ HTTP-статус 404, либо ответ 204. Мне кажется, это правильно, поскольку RFC7231 определяет HTTP-статус 204 как:

6.3.5. 204 Нет содержимого

Код состояния 204 (без содержимого) указывает, что сервер успешно выполнил запрос и что в теле полезной нагрузки ответа нет дополнительного содержимого для отправки. Метаданные в полях заголовка ответа относятся к целевому ресурсу и его выбранному представлению после применения запрошенного действия...

Ответ 204 позволяет серверу указать, что действие было успешно применено к целевому ресурсу, при этом подразумевается, что пользовательскому агенту не нужно уходить от своего текущего "представления документа" (если оно есть)...

Ответ 204 заканчивается первой пустой строкой после полей заголовка, потому что он не может содержать тело сообщения...

https://tools.ietf.org/html/rfc7231

Поскольку пользовательский агент запрашивает только заголовки, а не сам файл, 204, похоже, подходит.

Сюрприз № 1:

Когда элемент имеет URL-адрес для атрибута данных, MSIE/Edge сначала делает запрос HTTP HEAD, чтобы определить тип содержимого через заголовки ответа. В то время как другая MS извращается, это имеет смысл, поскольку она позволяет браузеру предварительно загружать необходимые обработчики до получения контента. Когда он получает подходящий ответ на запрос HEAD, он делает запрос HTTP GET для самого файла.

Теперь, это не было бы такой большой проблемой, если бы не...

Сюрприз № 2:

Когда MSIE / Edge получает ответ 204 на свой запрос HEAD, он обрабатывает его как ошибку и прерывает загрузку файла.

Излишне говорить, что это было довольно сложно обнаружить (процесс и само открытие).

Я неправильно понял цель или использование ответа 204? Я знаю, что использование в промышленности часто отличается от спецификаций, но это кажется... неправильным.

2 ответа

Решение

Когда вы возвращаете 204 с HEAD, вы говорите пользовательскому агенту, что если он сделает GET, то он также получит 204, и, следовательно, нет содержимого для извлечения. С точки зрения агента пользователя нет смысла делать GET, потому что HEAD извлек всю информацию, которая была доступна.

Если выполнение запроса GET возвращает 200, то HEAD также должен вернуть 200.

Я инженер в команде Edge и вижу проблему, к которой вы обращаетесь. В настоящее время я рекомендую вам использовать ответ 200 OK, даже когда вы просто отправляете заголовки (как это довольно часто встречается).

Я согласен, что два запроса вне нормы, и что 204, вероятно, не должны препятствовать последующему запросу GET.

Я подал ошибку для нашей команды, чтобы оценить эту проблему более тщательно.

https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8499759/

Другие вопросы по тегам