404 Not Found: сломанные ссылки, мягкие 404 и когда использовать 410
404 Not Found означает, что у сервера нет текущего представления для этого URL, и ничего не говорит о том, существовал ли ресурс вообще и вернется ли он. Эта неоднозначность и есть суть: 404 может быть сломанной ссылкой, которую стоит исправить, страницей, намеренно удаленной вами, либо страницей, которая прекрасно работает и лишь притворяется отсутствующей.
Что 404 говорит, а что нет
Согласно RFC 9110, 404 означает, что исходный сервер не нашел текущего представления для целевого ресурса, либо не желает раскрывать, что оно существует. Из этой формулировки следуют две детали.
Во-первых, 404 намеренно уклончив насчет постоянства. Он не обещает, что URL останется мертвым, поэтому краулеры еще долго продолжают повторно пытаться получить URL с 404. Во-вторых, 404 по умолчанию кэшируем согласно RFC 9111, так что кэширующий прокси или CDN может сохранить ошибку и продолжать ее отдавать даже после того, как вы устранили первопричину. Всегда очищайте кэш после исправления 404 и перепроверяйте.
404 - это также нормальный, здоровый ответ. Его возвращает любой сайт. Внимания заслуживают те, что встречаются на URL, которые должны работать, или на URL, которые пытаются найти люди.
Сломанная ссылка или намеренное удаление?
Эти два случая выглядят идентично по коду состояния и требуют противоположных действий.
Сломанная ссылка означает, что содержимое существует, но URL неверен. Обычные причины - опечатка во внутренней ссылке, слаг, отредактированный после публикации, несовпадение по регистру, разница в завершающем слеше, миграция сайта, изменившая схему URL, либо деплой, переставший выпускать файл. Решение - восстановить URL или сделать редирект.
Настоящее удаление означает, что содержимое пропало и не вернется: истекшее объявление о вакансии, снятый с продажи товар, удаленная страница аккаунта. Здесь 404 честен, но ленив, потому что оставляет краулеров повторяющими попытки, а посетителей - ни с чем.
Практический способ их различить: существует ли сегодня где-то на сайте эквивалентная страница? Если да, делайте редирект. Если нет, выбирайте между 404 и 410.
410 Gone, честная альтернатива
410 говорит, что ресурс был доступен и был намеренно удален, и ожидается, что это состояние постоянно. Там, где 404 означает "не найдено", 410 означает "удалено намеренно, перестаньте спрашивать".
Используйте 410, когда намеренно снимаете содержимое с публикации и у вас нет замены. Это правильный сигнал для истекших объявлений, страниц снятых с продажи товаров и содержимого, удаленного по юридическим или редакционным причинам. Поисковые системы обычно относятся к 410 как к более сильному и быстрому сигналу удаления, чем 404, хотя в итоге оба приводят к выпадению URL. Как и 404, 410 по умолчанию кэшируем.
Не используйте 410 для того, что вы могли бы восстановить, и не используйте его как универсальный обработчик для неизвестных URL. Если существует подходящая страница-замена, редирект лучше любого из этих кодов, а выбор самого редиректа тоже имеет значение: про то, какой выбрать, смотрите 301 против 302.
Мягкие 404 и почему их пропускают мониторы
Мягкий 404 - это страница, возвращающая 200 OK, содержимое которой говорит, что ресурс отсутствует. Это происходит, когда приложение ловит собственное условие "не найдено" и отрисовывает дружелюбный шаблон "страница не найдена", не устанавливая код состояния, либо когда маршрут-заглушка отдает главную страницу для каждого несовпавшего URL.
Поисковые системы и мониторы аптайма тогда читают одну и ту же страницу противоположным образом. Google изучает отрисованное содержимое, распознает паттерн отсутствующего содержимого и классифицирует ее как мягкий 404 в Search Console, так что URL не индексируется, но бюджет обхода на него все равно тратится, а сигнал замутнен. Монитор, сравнивающий коды состояния, видит 200 и сообщает, что страница здорова, и именно так целый раздел может отдавать текст "не найдено" каждому посетителю, пока панель остается зеленой.
Решение на сайте - возвращать настоящий 404 вместе со страницей ошибки, что ничего не стоит и удовлетворяет обоих читателей. Решение в мониторинге - проверять и содержимое, и статус: убедитесь, что известная фраза с настоящей страницы присутствует, так что страница, возвращающая 200 с неверным телом, все равно провалит проверку.
Как исправлять 404 в верном порядке
- Подтвердите настоящий код, а не видимую страницу. Дружелюбный экран ошибки ничего не доказывает:
Если это печатает 200 для страницы, читающейся как "не найдено", у вас мягкий 404.curl -sS -o /dev/null -w "%{http_code}\n" https://example.com/missing-page - Найдите, какие URL затронуты. И логи доступа сервера, и Search Console перечисляют URL 404 вместе с объемом. Исправляйте по трафику, а не по алфавиту.
- Сначала исправьте внутренние ссылки. 404, до которого дошли из вашей собственной навигации, полностью в вашей власти, и это исправление с наибольшей ценностью.
- Делайте редирект там, где существует настоящий эквивалент. Сопоставляйте старый URL с ближайшей текущей страницей, по одному URL за раз. Избегайте редиректа всего подряд на главную страницу, которую поисковые системы тоже считают мягким 404.
- Возвращайте 410 для намеренных удалений без замены, чтобы краулеры перестали повторять попытки.
- Сделайте страницу 404 полезной. Поиск, основная навигация и популярные ссылки возвращают посетителей, которых теряет голая страница ошибки.
- Очищайте кэши и перепроверяйте. Поскольку 404 кэшируем, проверяйте исправленный URL снаружи своей сети, а не только с источника.
Проверка кода и содержимого вместе
Правка слага, обновление плагина или изменение маршрутизации ломает набор URL, пока главная страница продолжает загружаться, так что ничего не оповещает, и никто не замечает, пока не падают трафик или конверсии. Плановая HTTP-проверка ваших важных URL сравнивает и код состояния, и ожидаемое содержимое страницы, что одинаково ловит и настоящий 404, и мягкий 404. О более широком семействе кодов клиента, и о том, как отличить настоящую ошибку клиента от неверной конфигурации сервера, смотрите обзор 4xx.