"ПРЕДУПРЕЖДЕНИЕ: предварительные заголовки отображаются" в отладчике Chrome
Я заметил странное предупреждение, глядя на загруженные ресурсы с помощью Google chrome inspector (F12):
Предупреждающие условные заголовки показаны
![enter image description here]()
Я нашел что-то, что возможно релевантно, Network Panel: добавьте осторожность в предварительные заголовки запросов, но я не мог полностью это понять. Связанные вопросы можно найти запросы блока Chrome, а XMLHttpRequest не может загрузить. Выгруженные ресурсы проявляют осторожность: показаны предварительные заголовки.
Как и в первом вопросе мой ресурс был заблокирован, но позже автоматически загрузился тот же ресурс. В отличие от второго вопроса , я не хочу ничего исправить; Я хочу знать, что означает это сообщение и почему я его получил.
Ответы
Ответ 1
Ресурс может быть заблокирован расширением (в моем случае AdBlock).
Сообщение пришло, потому что запрос на получение этого ресурса никогда не был сделан, поэтому отображаемые заголовки не являются реальными. Как объяснялось в проблеме, на которую вы ссылались, реальные заголовки обновляются, когда сервер отвечает, но нет ответа, если запрос был заблокирован.
Я узнал о расширении, которое блокировало мой ресурс, с помощью инструмента net-internals в Chrome:
Для последних версий Chrome
- Введите
chrome://net-export/
в адресной строке и нажмите ввод.
- Начать запись. И сохраните файл записи на локальном компьютере.
- Откройте страницу с проблемами.
- Вернуться к net-internals
- Вы можете просмотреть Записанный файл журнала здесь https://netlog-viewer.appspot.com/#import
- нажмите events (###) и используйте текстовое поле, чтобы найти событие, связанное с вашим ресурсом (используйте части URL).
- Наконец, нажмите на событие и посмотрите, говорит ли вам что-то показанная информация.
Для старых версий хрома
- Введите
chrome://net-internals
в адресной строке и нажмите ввод.
- Откройте страницу с проблемами.
- Вернитесь к net-internals, нажмите events (###) и используйте текстовое поле, чтобы найти событие, связанное с вашим ресурсом (используйте части URL).
- Наконец, нажмите на событие и посмотрите, говорит ли вам что-то показанная информация.
Ответ 2
Я считаю, что это происходит, когда фактический запрос не отправляется. Обычно происходит при загрузке кэшированного ресурса.
Ответ 3
Для хрома v72+ это решило только для меня следующее:
перейдите в chrome://flags/
и отключите эти 3 флага
- Отключить изоляцию сайта
- Включить сетевой сервис
- Запускает сетевой сервис в процессе
![enter image description here]()
или вы можете сделать это из командной строки:
chrome --disable-site-isolation-trials --disable-features=NetworkService,NetworkServiceInProcess
почему это случилось?
Похоже, что Google реорганизует свой движок Chromium в модульную структуру, где различные сервисы будут разделены на отдельные модули и процессы. Они называют этот процесс обслуживанием. Сетевой сервис - это первый шаг, сервис Ui, сервис идентификации и сервис устройств. Google предоставляет официальную информацию на сайте проекта Chromium.
опасно ли это изменить?
Примером является сетевое взаимодействие: когда у нас есть сетевой сервис, мы можем выбрать его запуск вне процесса для лучшей стабильности/безопасности или внутрипроцессного, если мы ограничены в ресурсах. источник
Ответ 4
Я столкнулся с этой проблемой, и мне удалось определить конкретную причину, которая не упоминается выше ни в ответах, ни в вопросе.
Я запускаю полный стек js, angular front end и node back end на SSL, а API находится в другом домене, запущенном на порту 8081, поэтому я делаю запросы CORS и withCredentials, когда я отбрасываю cookie сеанса из API
Таким образом, в первую очередь мой сценарий был: POST-запрос, withCredentials на порт 8081 вызвал сообщение "ПРЕДОСТЕРЕЖЕНИЕ: предварительные заголовки показаны" в инспекторе, а также, конечно же, заблокировал запрос вместе.
Мое решение состояло в том, чтобы настроить apache на прокси-сервер, передав запрос с обычного порта SSL 443 на порт node SSL 8081 (node должен быть на более высоком порту, поскольку он не может быть запущен с правами root в прод). Поэтому я думаю, что Chrome не любит запросы SSL к нетрадиционным портам SSL, но, возможно, их сообщение об ошибке может быть более конкретным.
Ответ 5
Это также может произойти (только для запросов из разных источников) из-за новой функции, называемой изоляцией сайта
.На этой странице подробно описывается проблема и возможное решение. Для этого перейдите к chrome://flags/#site-isolation-trial-opt-out
в Chrome, измените этот параметр на "Отказ" и перезагрузите Chrome.
Это известная проблема. Однако на этой странице написано, что она исправлена в Chrome 68, но я использую Chrome 68 и у меня все еще есть проблема.
Ответ 6
HTTP/2 Pushed resources создаст Provisional headers are shown
в инспекторе для той же теории, что и @wvega, опубликованный в его ответе выше.
, например:. Так как сервер подтолкнул ресурс к клиенту (до того, как клиент запросил их), браузер имеет ресурсы, кэшированные и, следовательно, клиент никогда не делает/не требует запросов; Так что...
... реальные заголовки обновляются, когда сервер отвечает, но нет ответа, если запрос был заблокирован.
Ответ 7
Моя ситуация связана с кросс-происхождением.
Ситуация: браузер отправляет запрос OPTIONS
перед отправкой реального запроса, например GET
или POST
. Разработчик backend забывает обрабатывать запрос OPTIONS
, позволяя ему пройти через служебный код, делая слишком длительным время обработки. Дольше, чем тайм-аут, который я написал в инициализации axios
, что составляет 5000 миллисекунд. Поэтому реальный запрос не может быть отправлен, а затем я столкнулся с provisional headers are shown
проблему.
Решение. Когда дело доходит до запроса OPTIONS
, backend api просто возвращает результат, он ускоряет запрос и реальный запрос может быть отправлен до истечения таймаута.
Ответ 8
Я сомневаюсь, что мой ответ вовремя поможет вам, но другие могут оказаться полезными. Я столкнулся с аналогичной проблемой с созданным мной jQuery Ajax Post script.
Оказалось, что у меня была опечатка в атрибуте href тега A, который я использовал для запуска сообщения. Я набрал href= " javacsript:;" (изменение "s" и "c" ). Это привело к тому, что script попытался обновить страницу во время попытки записи. скорректировал опечатку, и это сработало отлично для меня.
Ответ 9
Это сообщение может появляться, когда веб-сайт защищен с помощью HSTS. Затем, когда кто-то ссылается на HTTP-версию URL-адреса, браузер, как указано HSTS, не выдает HTTP-запрос, а внутренне перенаправляет на HTTPS-ресурс. Это делается для того, чтобы избежать атак с понижением HTTPS, таких как sslstrip.
Ответ 10
Это может произойти из-за того, что вы отправили запрос Ajax, и в то же время вы перешли на другую страницу, используя location.href или что-то в этом роде. Так что предыдущий запрос не удался.
Ответ 11
Это предупреждение также возникает, если ответ недействителен и поэтому брошен браузером.
В моем случае запрос был правильно отправлен на сервер, тогда код на стороне сервера выдал ошибку, и моя пользовательская обработка ошибок вернула сообщение об ошибке в поле сообщения HTTP-статуса. Но эта ошибка не была получена на стороне клиента из-за недопустимых символов в сообщении об ошибке (здесь описано http://aspnetwebstack.codeplex.com/workitem/1386), что привело к повреждению ответа заголовки.
Ответ 12
Я столкнулся с этой проблемой с вызовом AJAX, который никогда не завершится. Я следил за советом wvega и советом об отладке с chrome://net-internals
, чтобы в конечном итоге определить другой обработчик событий click
на странице, прослушивание родительского node, заставляя браузер перейти к тому же URL-адресу (так что это было нелегко заметно).
Решение заключалось в том, чтобы добавить event.stopPropagation()
в обработчик click
на кнопку отправки формы, чтобы не допустить, чтобы щелчок запустил DOM и отменил выполняемый запрос AJAX (инициирован с помощью обработчика submit
на form
).
Ответ 13
У меня это появилось совсем недавно (сегодня на самом деле), где у меня был вызов AJAX, выходящий на сервер, и Chrome срабатывает "Предупреждение: отображаются предварительные заголовки". В сценариях на стороне сервера PHP есть MySQL-запросы, которые могут быть довольно мгновенными или занимать несколько секунд в зависимости от данного сценария. Ответ моего сервера не отправляется обратно в браузер до тех пор, пока запросы не будут завершены. Я обнаружил, что получаю эту ошибку только в том случае, когда выполняются длительные запросы (до нескольких секунд) и не дают ответа отсылаться обратно.
Мой сценарий включает очень редкую возможность изменить таблицу, добавив/удалив сотни столбцов для вывода погодной модели... следовательно, отставание ответа от итерации через цикл запросов ALTER TABLE.
Ответ 14
Общей причиной этого является то, что вы отслеживаете событие и не предотвращаете действие по умолчанию. Например, если у вас есть событие click, то вы захотите включить:
e.preventDefault();
или
return false;
Если вы этого не сделаете, вы увидите предупреждение предварительных заголовков, а также "отмененный" статус на вкладке "Сеть" на своей веб-консоли.
Ответ 15
В моем случае это был всего лишь ложный путь к ресурсу (svg/img)
Ответ 16
Эта проблема возникла, когда я отправил недопустимый заголовок HTTP-авторизации. Я забыл base64 закодировать его.
Ответ 17
Я наткнулся на это, и он ушел, когда я переключился с https на http. Сертификаты SSL, которые мы используем в dev, не проверяются сторонними лицами. Они только локально созданы dev certs.
Те же звонки отлично работают в Chrome Canary и Firefox. Эти браузеры, похоже, не столь строгие относительно сертификата SSL, как Chrome. Вызовы завершились с ошибкой в Chrome с сообщением "ПРЕДУПРЕЖДЕНИЕ: Предварительные заголовки...".
Я думаю/надеюсь, что когда мы используем законный SSL-сертификат в стадии и prod, мы больше не увидим это поведение в Chrome.
Ответ 18
Я запустил эту проблему, когда попытался загрузить main.js для вызова js во второй раз после внесения изменений в результате ошибки.
Я только что включил "Настройки разработчика" "Отключить кеш (когда DevTools открыт)".
и это сделало очарование.
Ответ 19
Еще один возможный сценарий, который я видел, - тот же самый запрос отправляется снова через несколько миллисекунд (скорее всего, из-за ошибки на стороне клиента).
В этом случае вы также увидите, что статус первого запроса "отменен" и что время ожидания составляет всего несколько миллисекунд.
Ответ 20
Это происходило для меня, когда у меня была ссылка для загрузки, и после нажатия на нее я также пытался поймать клик с помощью jquery и отправить запрос ajax. Проблема заключалась в том, что когда вы нажимаете на ссылку для загрузки, вы покидаете страницу, даже если она не выглядит так. Если файл не будет передан, вы увидите запрошенную страницу. Поэтому я поставил цель = "_ blank" для предотвращения этой проблемы.
Ответ 21
Я получил эту ошибку, когда попытался распечатать страницу во всплывающем окне. Диалоговое окно печати было показано, и оно все еще ожидает моего принятия или отмены печати во всплывающем окне, а на главной странице также ожидалось в фоновом режиме, показывая сообщение ПРЕДОСТЕРЕЖЕНИЕ предварительные заголовки отображаются, когда я пытался щелкнуть другое соединение.
В моем случае решение заключалось в том, чтобы удалить window.print ();
script, который он выполнял во <body>
всплывающего окна, чтобы предотвратить диалог печати.
Ответ 22
Я видел, что это произошло, когда количество подключений к моему серверу превысило максимальный уровень Chrome max-connections-per-server 6.
Ответ 23
Используйте этот код кода вашего кода:
header('Cache-Control: no-cache, no-store, must-revalidate');
header('Pragma: no-cache');
header('Expires: 0');
Это работает для меня.
Ответ 24
Просто бросаю мои два цента. Я пишу веб-приложение, используя запросы CORS и полный веб-сервис RESTful. Я обнаружил, что хром будет выкидывать эту ошибку, когда у меня есть неполученное исключение или ошибка PHP. Просто запустите кого-нибудь другого в проблему. Я обнаружил, что когда это произойдет, я могу запустить приложение Chrome "Postman - Rest Client" и запустить тот же запрос, но в приложении Chrome я фактически получаю ошибку PHP, которая будет выбрана вместо этой не описательной ошибки.
Ответ 25
Вот еще одно решение.
Если вы столкнулись с этой проблемой при вызове $ajax(), добавьте http://
, прежде чем ваш сервер будет решить вашу проблему.
var requestURL = "http://" + serverHost;
$.ajax({
dataType: "json",
url: requestURL,
data: data,
success: success
});
Ответ 26
Если вы разрабатываете приложение Asp.Net Mvc и пытаетесь вернуть JsonResult
в свой контроллер, добавьте JsonRequestBehavior.AllowGet
в метод Json
. Это исправило это для меня.
public JsonResult GetTaskSubCategories(int id)
{
var subcategs = FindSubCategories(id);
return Json(subcategs, JsonRequestBehavior.AllowGet); //<-- Notice it has two parameters
}
Ответ 27
"Предупреждение: предварительные заголовки показаны" сообщение может быть показано, когда веб-сайт, размещенный в HTTPS, вызывает вызовы WebApi, размещенные по протоколу HTTP. Вы можете проверить все, если все ваши Api - HTTPS. Браузер предотвращает вызов ненадежного ресурса. Вы можете увидеть подобное сообщение в своем коде, когда используете API FETCH для домена с HTTP.
Смешанный контент: страница с надписью https://website.com 'была загружена через HTTPS, но запросила небезопасный ресурс' http://webapi.com '. Этот запрос заблокирован; содержимое должно быть передано через HTTPS.
Ответ 28
У меня была аналогичная проблема с моим MEAN-приложением. В моем случае проблема происходила только в одном запросе на получение. Я попытался с удалением adblock, попробовал очистить кеш и пробовал с разными браузерами. Ничего не помогло.
Наконец, я понял, что api пытается вернуть огромный объект JSON. Когда я пытался отправить небольшой объект, он работал нормально. Наконец, я изменил свою реализацию, чтобы вернуть буфер вместо JSON.
Я хочу выразить JS, чтобы вывести ошибку в этом случае.
Ответ 29
Очищенные кэшированные данные из истории браузера работают для меня.
Ответ 30
Эта проблема также возникает при использовании некоторых пакетов, таких как webpack-hot-middleware
и одновременно открывающих несколько страниц. webpack-hot-middleware
создаст соединение для каждой страницы для прослушивания изменений кода, а затем обновит страницу. Каждый браузер имеет ограничение на max-connections-per-server
которое составляет 6 для Chrome, поэтому, если вы уже открыли более 6 страниц в Chrome, новый запрос будет зависеть там, пока вы не закроете некоторые страницы.