Определение кода 410 Gone
Код 410 — HTTP статус, который возвращает сервер, когда целевой ресурс был удален навсегда. В спецификации протокола HTTP 1.1 (RFC 7231) это определяется как постоянное исчезновение ресурса без перспективы восстановления. Слово Gone означает именно это — ушел, исчез, больше недоступен.
Когда вы удаляете пост на сайте, закрываете аккаунт пользователя или стираете контент по политике конфиденциальности, сервер должен возвращать именно этот код ответа. Не 404, не 500, а 410. Это техническое сообщение браузеру и поисковым системам: здесь было что-то, но теперь это удалено окончательно.
Как 410 отличается от 404 Not Found
Начнём с главного источника путаницы. Код ошибки 404 Not Found и 410 Gone выглядят похоже, но работают совершенно по-разному.
404 Not Found — это когда сервер говорит: «Я не знаю, существовал ли здесь этот ресурс вообще. Его нет сейчас, но, возможно, он появится позже». Робот поисковых систем получает такой ответ и думает: «Хорошо, проверю еще раз через пару недель, может, контент восстановят».
410 Gone — четкое заявление: «Ресурс был удален постоянно. Навсегда. Не приходите больше». Краулер поиска понимает это как сигнал удалить страницу из индекса без дополнительных проверок.
Вот где это имеет значение. При возвращении 404 поисковый робот продолжит приходить на вашу страницу. Он потратит ресурсы на проверку ссылки, займет место в логах сервера, создаст лишний трафик. При 410 робот немедленно прекращает попытки и освобождает ресурсы.
Проверить это легко. Возьмите удаленную страницу своего сайта. Если она возвращает 404, очистка из индекса Яндекса может занять несколько месяцев. Если вы изменили статус на 410, процесс ускорится в несколько раз. Яндекс Вебмастер быстрее удалит ее из поиска, и ваше внутреннее кэширование будет работать эффективнее.
Практические примеры использования 410
Когда разработчика спрашивают, где использовать 410, он часто затрудняется ответить. На самом деле это вполне конкретные случаи.
Удаленный аккаунт пользователя. Человек удалил профиль на вашей платформе. Все его данные удалены из системы — посты, комментарии, загруженные файлы. URL его профиля должен возвращать 410. При этом не 404, потому что это был реальный ресурс, который люди могли сохранить в закладках или ссылки на него могли быть опубликованы.
Удаленный пост в блоге или соцсети. Автор опубликовал статью, потом изменил решение и удалил ее полностью. Это не архивирование (когда контент остается в какой-то форме), а полное удаление. Код 410 правильно описывает эту ситуацию.
Контент, удаленный по требованию. Например, пользователь обратился с просьбой забыть его персональные данные в соответствии с политикой конфиденциальности. Все страницы с его информацией должны возвращать 410, чтобы поисковые системы быстро убрали их из индекса.
Закрытый репозиторий на GitHub. Разработчик удалил репозиторий. Внешние ссылки на его файлы и pull requests больше не работают. При попытке доступа через старую ссылку получите 410 вместо 404.
Почему это важно для поисковых систем
Разработчики часто недооценивают значение правильного кода ответа. Но для поисковых систем это критично.
Google и Яндекс используют коды ответа сервера как сигналы при обработке страниц. Когда краулер наталкивается на 410, он выполняет несколько действий:
Немедленно удаляет страницу из индекса поиска без задержек. При 404 это занимает время, краулер может пересчитать, достаточно ли он проверял — и только потом удалит.
Останавливает переизучение этого URL. Робот не будет приходить сюда повторно, как при 404, когда он может проверить страницу через неделю или месяц.
Освобождает свой бюджет сканирования для других страниц вашего сайта. У каждого краулера есть лимит — сколько страниц он может посетить в день. Не тратьте этот ресурс на проверку удаленного контента.
Это особенно важно для крупных сайтов. Если вы используете 404 для всех удаленных ресурсов, часть мощности поисковых систем уходит на переизучение старого контента вместо индексирования нового.
Различие между 410 и другими кодами состояния
На первый взгляд, 410 похож на множество других кодов. Вот где они действительно отличаются.
301 Moved Permanently. Это перенаправление. Ресурс переехал на новый адрес, браузер должен обновить закладку, поисковый робот должен прыгнуть на новую ссылку. При 410 нет нового адреса — ресурс просто удален.
302 Found и 307 Temporary Redirect. Ресурс временно недоступен, но скоро вернется. При 410 нет возврата — это постоянное состояние.
404 Not Found. Мы это уже разобрали. 404 означает неуверенность: может быть, был, может не быть. 410 — полная уверенность: был, но больше нет.
451 Unavailable For Legal Reasons. Похоже на 410, но причина другая. Контент недоступен из-за юридического требования. При 451 ресурс может быть доступен в другой стране или при других обстоятельствах.
500 Internal Server Error. Временная проблема с сервером. Робот будет пытаться еще много раз. При 410 краулер сразу сдается.
Правильный выбор кода состояния определяет поведение браузера, поведение поисковых роботов и даже опыт пользователя. Загвоздка в том, что многие разработчики просто возвращают 404 на всё и пропускают более точные коды.
Как выглядит ответ 410 на практике
Когда браузер или краулер делает запрос к удаленному ресурсу, сервер отправляет это:
HTTP/1.1 410 Gone
Content-Type: text/html; charset=utf-8
Content-Length: 145
Date: Wed, 01 Oct 2026 10:30:00 GMT
<!DOCTYPE html>
<html lang='ru'>
<head><title>410 Gone</title></head>
<body>
<h1>Ресурс удален</h1>
<p>Страница удалена постоянно и больше недоступна.</p>
</body>
</html>
Статус-код 410 в заголовке response — это самое важное. Браузер получит это сообщение и поймет, что дальше бесполезно.
На Node.js реализация простая:
app.get('/api/posts/:id', (req, res) => {
const post = findPost(req.params.id);
if (!post) {
return res.status(410).send('Пост был удален');
}
res.json(post);
});
На Python с Flask:
@app.route('/posts/<int:post_id>')
def get_post(post_id):
post = find_post(post_id)
if not post:
return 'Пост удален', 410
return jsonify(post)
Когда клиент (например, JavaScript приложение) получает такой ответ:
fetch('https://example.com/api/posts/12345')
.then(response => {
if (response.status === 410) {
console.log('Этот ресурс был удален окончательно');
showMessage('Контент удален и больше недоступен');
} else if (response.status === 404) {
console.log('Ресурс не найден, возможно, он был переименован');
}
return response.json();
})
.catch(error => console.error(error));
Разница в обработке очевидна. При 410 вы знаете: дальше ждать нечего. Контент удален постоянно. При 404 приложение может показать пользователю форму поиска или предложить похожий контент — может быть, именно это имелось в виду.
