404 и редиректы в Apache (.htaccess)
В Apache страницу 404 задаёт директива ErrorDocument 404 /404.html, а 301-редиректы пишут в .htaccess через Redirect 301 или RewriteRule … [R=301,L] с RewriteCond.
Обновлено 11 октября 2026 г.
Страница 404 через ErrorDocument
ErrorDocument 404 /404.htmlПуть с косой чертой в начале означает локальный адрес на этом же сервере: Apache отдаёт содержимое 404.html, а статус остаётся 404. Если указать полный URL (ErrorDocument 404 https://example.com/404.html), Apache отправит клиенту перенаправление 302 — страница ошибки начнёт отвечать 200, и поисковые системы увидят soft 404. Это прямо описано в документации Apache.
Файл .htaccess работает, только если в конфигурации виртуального хоста для каталога разрешён AllowOverride (для ErrorDocument, Redirect и mod_rewrite — группа FileInfo). На хостингах это обычно включено.
301-редиректы через Redirect и RedirectMatch
Redirect (модуль mod_alias) — самый простой вариант. Он сравнивает начало пути и подставляет остаток к новому адресу.
# одна страница
Redirect 301 /old-page.html https://example.com/new-page/
# весь раздел (хвост пути сохраняется)
Redirect 301 /old-section/ https://example.com/new-section/
# по регулярному выражению
RedirectMatch 301 "^/blog/(\d{4})/(.+)quot; "https://example.com/articles/$2"Redirect не учитывает параметры запроса и схему, для таких случаев нужен mod_rewrite.
RewriteRule и RewriteCond
mod_rewrite подходит для условий: по домену, протоколу, параметрам запроса. Флаг R=301 делает редирект постоянным, L останавливает обработку правил. В .htaccess шаблон RewriteRule пишется без начальной косой черты.
RewriteEngine On
# http -> https
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
# www -> без www
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
# одна страница
RewriteRule ^old-page/?$ /new-page/ [R=301,L]
# по параметру запроса; ? в конце убирает старые параметры
RewriteCond %{QUERY_STRING} ^id=15$
RewriteRule ^product\.php$ /catalog/item-15/? [R=301,L]RewriteRuleне видит строку запроса. Для параметров нуженRewriteCond %{QUERY_STRING}.- Без
?в конце результата старые параметры дописываются к новому адресу. RewriteCondдействует только на ближайшее следующееRewriteRule.- Если добавить
Rбез кода, будет 302 — используйтеR=301явно.
Правила для переезда можно собрать в генераторе редиректов: он выгружает готовый .htaccess и конфиг nginx. Что такое 301 и чем он отличается от 302 — в статье про 301-редирект.
Частые ошибки
- Смешали `Redirect` и `RewriteRule`. Это разные модули (
mod_aliasиmod_rewrite), и порядок их выполнения при смешивании не очевиден. Берите один механизм для однотипных правил. - Забыли `L`. После срабатывания правила продолжается обработка следующих, и итоговый адрес может оказаться не тем.
- Циклы. Например, правило
/a → /a/вместе с правилом, убирающим слеш. Результат — ERR_TOO_MANY_REDIRECTS. - ErrorDocument с полным URL. Страница ошибки отвечает 302 → 200.
- Правила редиректа после общих правил CMS. В WordPress и Битрикс свои редиректы ставят выше блока CMS, иначе запрос обработает движок.
- Синтаксическая ошибка. Она приводит к 500: проверяйте на тестовом хосте или командой
apachectl configtest(для основного конфига).
Как найти 404 в логах Apache
# формат combined: статус — девятое поле, путь — седьмое
awk '$9 == 404 {print $7}' /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -30На разных дистрибутивах путь к логам отличается (/var/log/httpd/ на RHEL-подобных). После внесения правил проверьте результат на нескольких старых адресах в проверке HTTP-статуса: должен быть один шаг 301 до конечной страницы.
Подключение Monitor404
Добавьте код трекера в страницу, указанную в ErrorDocument (404.html). Он срабатывает при каждом показе страницы ошибки и фиксирует адрес, реферер и признаки бота.
<script src="https://collect.monitor404.ru/collect/ВАШ_ТОКЕН/script.js" async></script>Monitor404 покажет, куда ведут самые частые битые ссылки, предложит 301-цель по похожести с URL из sitemap и выгрузит готовые правила для .htaccess.
Частые вопросы
Как сделать страницу 404 в .htaccess?
Добавьте строку ErrorDocument 404 /404.html в .htaccess в корне сайта и положите файл 404.html рядом. Указывайте локальный путь, а не полный URL, иначе вместо 404 будет редирект.
Как сделать 301 редирект в .htaccess?
Самый простой вариант: Redirect 301 /old-page/ https://example.com/new-page/. Если нужны условия — используйте RewriteRule ^old-page/?$ /new-page/ [R=301,L] и RewriteEngine On выше.
Как сделать редирект с http на https в .htaccess?
Включите RewriteEngine On, добавьте RewriteCond %{HTTPS} off и правило RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]. Подставьте свой домен.
Почему .htaccess не работает?
Чаще всего на сервере запрещён AllowOverride для каталога, не включён mod_rewrite или сайт работает на nginx, который .htaccess не читает. Проверьте также синтаксис и расположение файла.