Ошибка 404 - единственная в этом списке, которая обычно работает правильно. Сервер прекрасно понял запрос, поискал то, что вы просили, и там ничего не оказалось. Ничего не упало и ничего не настроено неверно. Вы попросили то, чего не существует, и вам об этом сказали.

Поэтому ошибку 404 в адресной строке редко стоит преследовать. Ссылка была старой, страница переехала, кто-то опечатался. Это самый скучный сбой в вебе.

Интересные до адресной строки не доходят никогда.

Ошибка 404, которую вы видите, против той, которую не видите

Когда вы набираете адрес и получаете 404, браузер показывает вам страницу, и на этом история заканчивается. Вы точно знаете, что случилось.

Когда страница, на которой вы уже находитесь, запрашивает что-то в фоне и получает 404, вам об этом не скажет ничто. Не пришедшая таблица стилей оставляет вёрстку сломанной на вид, но отрисованной. Скрипт с ошибкой 404 означает, что какая-то функция молча ничего не делает. Запрос fetch за данными возвращает тело ошибки 404, которое код пытается разобрать как JSON, и наружу выходит TypeError, в нескольких шагах от настоящей проблемы.

Это та разновидность, которая порождает сообщение, знакомое каждому разработчику: “страница выглядит странно” или “кнопка ничего не делает”. Никакого сообщения об ошибке, потому что не было страницы ошибки. Сбой произошёл в сетевом журнале, а в сетевой журнал никто не смотрел.

Двести запросов могут составлять одну современную страницу. Любой из них может дать 404, не остановив остальные сто девяносто девять.

Почему фоновая ошибка 404 обычно означает выкатку

Ошибка 404 в адресной строке - это чья-то ссылка. Ошибка 404 на ресурс, который запросила сама страница, почти всегда сборка.

Переименованный файл или файл с отпечатком. Конвейеры сборки вставляют хеш содержимого в имя файла. Если HTML закеширован и указывает на старый хеш, а новая выкатка отдала новый, браузер просит файл, которого действительно больше нет. У большинства это проходит после перезагрузки и остаётся у всякого, кто держит закешированную страницу, - поэтому об этом так часто сообщает один человек, а воспроизвести не может никто другой.

Файл, который так и не загрузили. Молча провалившийся шаг сборки, ресурс, исключённый изменением конфигурации, путь, который работает локально из-за файловых систем, не различающих регистр, и падает на сервере с Linux, потому что Logo.svg - это не logo.svg.

Переехавший маршрут API. Фронтенд и бэкенд выкатились с небольшим сдвигом по времени, и несколько минут один просит эндпоинт, который другой уже переименовал.

Все три невидимы со страницы. Все три - одна строка в сетевом журнале.

Мягкие ошибки 404, которые хуже настоящих

Мягкая ошибка 404 - это страница, которая говорит человеку, что ничего не нашла, и при этом говорит всякой машине, что всё в порядке: приветливое “извините, здесь ничего нет”, отданное с кодом 200 OK.

Такое сочетание вредно так, как настоящая ошибка 404 не вредна. Поисковики индексируют её как работающую страницу, поэтому отсутствующее содержимое остаётся в выдаче. Мониторинг не срабатывает никогда, потому что мониторинг считает коды состояния. А любой код, проверяющий response.ok перед разбором, принимает страницу ошибки за данные и падает дальше по цепочке с сообщением о форме JSON, а не о том, что страницы нет.

Если вы возьмёте с этой страницы одно: страница ошибки обязана возвращать код ошибки. Сообщение, которое может прочитать человек, и правдивый код состояния не являются взаимозаменяемыми.

Ошибка 404 против кодов, с которыми её путают

404 Not Found
С запросом всё было в порядке, и по этому адресу ничего нет. Ничего не говорит о том, было ли там что-нибудь когда-либо
410 Gone
Здесь что-то было и удалено намеренно и навсегда. Поисковики отбрасывают такое быстрее
403 Forbidden
Оно существует, и вам оно не разрешено. Некоторые сайты намеренно возвращают вместо этого 404, чтобы никто не мог перебором составить карту существующего
400 Bad Request
Сервер вообще не смог разобрать запрос, поэтому до поиска дело не дошло

Третью строку стоит помнить, когда вы отлаживаете чужой API: ошибка 404 на ресурс, в существовании которого вы почти уверены, может оказаться переодетой ошибкой 403, скрывающей существование объекта от неавторизованного вызывающего. Проверьте, аутентифицированы ли вы, прежде чем считать запись пропавшей.

Если сайт ваш

Починить ошибку 404, которая перед вами, - лёгкая половина. Полезная работа в том, чтобы найти те, о которых никто не сообщает.

В журнале доступа сервера есть каждая из них вместе с адресом и реферером, и реферер - это та часть, которую пропускают. Он говорит вам, какая из ваших собственных страниц ссылается на отсутствующее, что превращает список ошибок 404 в список багов. Search Console делает ту же работу для всего, что достижимо снаружи.

Затем решите, чем должна стать каждая. Переехавшая страница хочет перенаправления на то, что её заменило, а не на главную, - последнее поисковики считают мягкой ошибкой 404, а читатели воспринимают как то, что их проигнорировали. По-настоящему удалённое хочет кода 410. Опечатка, на которую никто не ссылается, не хочет ничего: ошибки 404 нормальны, и сайт без единой - это сайт, перенаправляющий то, что перенаправлять не следует.

Почему о невидимых трудно сообщить

Фоновая ошибка 404 оставляет увидевшего её человека без всего, что можно описать. У него есть страница, которая выглядит неправильно, никакого сообщения об ошибке и никаких оснований думать, что какой-то файл не загрузился. Поэтому сообщение звучит как “у меня всё сломано”, а разработчик открывает страницу, видит, что она работает, и закрывает задачу.

Session Replay

Бесплатное расширение Chrome. Один клик на странице, которая ведёт себя неправильно, захватывает снимок экрана, консоль и сетевой журнал, и даёт вам ссылку для вставки в задачу.

Получить расширение

Сетевой журнал здесь и есть вся разница. Ошибка 404 на запрос, который сделала страница, невидима на экране и очевидна в журнале, поэтому сообщение, которое несёт журнал с собой, превращает “выглядит странно” в имя файла и номер строки. Обычно это и есть всё расследование.

В одном абзаце

Ошибка 404 означает, что сервер вас понял и по этому адресу у него ничего нет, и это делает её единственной ошибкой, которая обычно ведёт себя правильно. Те, что в адресной строке, - это чья-то устаревшая ссылка, и они редко важны. Важны те, что возникают на запросах, которые страница делает в фоне: отсутствующая таблица стилей, скрипт или маршрут API порождают страницу, которая выглядит неправильно и не имеет вообще никакого сообщения об ошибке, и почти всегда это восходит к выкатке: имя файла с отпечатком, файл, который не загрузили, или переехавший маршрут. Отдавайте настоящие ошибки 404 с кодом 404, а не с приветливым 200, потому что мягкая ошибка 404 обманывает поисковики и мониторинг одновременно. А если вы гонитесь за одной, реферер в журнале доступа - это то, что превращает список отсутствующих адресов в список страниц, которые на них ссылаются.