Запросы CORB OPTIONS заблокированы в Chrome 73

Похоже, что в недавнем выпуске Chrome (или, по крайней мере, недавно при вызовах моего API — не видел его до сегодняшнего дня) Google выдает предупреждения о блокировке запросов CORB.

Cross-Origin Read Blocking (CORB) blocked cross-origin response [domain] with MIME type text/plain. See https://www.chromestatus.com/feature/5629709824032768 for more details.

Я определил, что запросы к моему API выполняются успешно, и что это предварительный запрос OPTIONS вызывает предупреждение в консоли.

Приложение, которое вызывает API, явно не делает запрос OPTIONS, скорее, я понял, что это принудительно применяется браузером при выполнении запроса между источниками и выполняется браузером автоматически.

Я могу подтвердить, что ответ на запрос OPTIONS не имеет определенного типа mime. Однако я немного сбит с толку, поскольку, насколько я понимаю, ответ OPTIONS представляет собой только заголовки и не содержит тела. Я не понимаю, почему такой запрос требует определения MIME-типа.

Запросы CORB OPTIONS заблокированы в Chrome 73

Более того, в предупреждении консоли говорится, что запрос заблокирован; тем не менее, различные запросы POST и GET выполняются успешно. Получается, что запрос OPTIONS на самом деле не блокируется?

Запросы CORB OPTIONS заблокированы в Chrome 73

Это вопрос из трех частей:

  1. Почему запрос OPTIONS требует определения типа mime, когда нет ответа тела?
  2. Каким должен быть тип mime для запроса OPTIONS, если обычный/текст не подходит? Могу ли я предположить, что приложение/json является правильным?
  3. Как мне настроить сервер Apache2, чтобы он включал mime-тип для всех предварительных запросов OPTIONS?

Предварительная проверка OPTIONS проходит успешно. В случае сбоя браузер сразу же остановится и больше не будет пытаться выполнить ваш POST-запрос. Тот факт, что вы видите запрос POST, указывает на то, что предварительная проверка прошла успешно. Запрос OPTIONS не требует определения MIME-типа. В вопросе нет никаких указаний на то, что у вас есть какие-либо проблемы с CORS. Вместо этого у вас есть проблема CORB. Сообщение об ошибке, указанное в вопросе, указывает на то, что ваш код получает текстовый/простой ответ, но код пытается использовать этот ответ в каком-то контексте, где браузер не ожидает использования текста/простого текста.

sideshowbarker 12.04.2019 12:51

Вероятно, здесь вам помогут лучше, если вы обновите вопрос, добавив фрагмент кода вашего внешнего интерфейса, который показывает, как вы делаете запрос и как вы получаете ответ. Например, вы можете получить ошибку CORB, потому что ваш код пытается разобрать этот текстовый/обычный ответ как JSON.

sideshowbarker 12.04.2019 12:53

Правильно, как я заметил, запрос OPTIONS выполнен успешно, потому что запрос POST выполнен успешно. Вы также правы в том, что я тоже не думал, что для запроса OPTIONS нужен MIME-тип, но Chrome, похоже, так думает? Вы также правы в том, что у меня нет проблемы с CORS, мой вопрос не о CORS, поэтому я его не поднимаю. Как вы можете видеть в примере ответа POST, я возвращаю соответствующий MIME-тип — предупреждение в Chrome относится к запросу OPTIONS, который не имеет MIME-типа (потому что я считаю, что он не нужен). Я начинаю верить, что это ошибка в Chrome.

Crayons 12.04.2019 19:27
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
3
1 907
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я добрался до сути этих предупреждений CORB.

Проблема частично связана с тем, что я использую заголовок content-type-options: nosniff. Я установил этот заголовок, чтобы запретить браузеру пытаться пронюхать сам контент-тип, тем самым удаляя уловки mime-типа, а именно с файлами, загруженными пользователем, в качестве вектора атаки.

Другая часть этого связана с возвращаемым типом контента application/json;charset=utf-8. В документации Google отмечается:

A response served with a "X-Content-Type-Options: nosniff" response header and an incorrect "Content-Type" response header, may be blocked.

Исходя из этого, я решил дважды проверить сайт IANA на допустимые типы носителей. К моему удивлению, я обнаружил, что ни один параметр charset не был определен ни в одном RFC для типа приложение/json, и дополнительные примечания:

No "charset" parameter is defined for this registration. Adding one really has no effect on compliant recipients.

Исходя из этого, я удалил кодировку из content-type: application/json и могу подтвердить, что предупреждения CORB остановлены в Chrome.

В заключение, похоже, что в недавнем выпуске Chrome Google решил начать относиться к MIME-типу более строго, чем в прошлом.

Наконец, в качестве примечания, причина, по которой все запросы нашего приложения по-прежнему выполняются успешно, заключается в том, что в Chrome отображается блокировка чтения из разных источников на самом деле не соблюдается:

In most cases, the blocked response should not affect the web page's behavior and the CORB error message can be safely ignored.

Здесь точно такие же ошибки. Вы включили Content-Type: application/json в заголовки ответов запросов OPTIONS? Я удалил кодировку из своих ответов, и я все еще получаю эти предупреждения (мой API не предоставляет заголовок Content-Type для запросов OPTIONS)

gouy_e 13.05.2019 13:23

В моих тестах использование application/json;charset=utf-8 по сравнению с использованием application/json в качестве типа контента не оказывает никакого влияния на предупреждающее сообщение CORB. Единственный способ, которым я смог удалить предупреждение, — это прекратить возвращать заголовок content-type-options: nosniff для запросов OPTIONS.

JanneK 18.05.2019 10:40

Я сделал небольшую тестовую утилиту, доступную здесь: foobar.kytomaki.com/corb-test. Он делает POST-запрос к PHP-скрипту. По умолчанию скрипт возвращает заголовок nosniff только для запроса POST, и вы не должны видеть никаких предупреждений. При установке первого флажка заголовок также возвращается для запроса OPTIONS, и вы должны увидеть предупреждение CORB. Второй флажок определяет, будет ли кодировка добавляться в конец типа содержимого, и для меня это не имеет никакого значения.

JanneK 18.05.2019 10:41

Была такая же проблема.

Проблема, с которой я столкнулся, была связана с тем, что API отвечал на предварительную проверку с помощью 200 OK, но был пустым ответом без установленного заголовка Content-Length.

Таким образом, либо изменение статуса ответа предварительной проверки на 204 No Content, либо просто установка заголовка Content-Length: 0 решили проблему.

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