Monitor404

404 и редиректы в Apache (.htaccess)

В Apache страницу 404 задаёт директива ErrorDocument 404 /404.html, а 301-редиректы пишут в .htaccess через Redirect 301 или RewriteRule … [R=301,L] с RewriteCond.

Обновлено 11 октября 2026 г.

Страница 404 через ErrorDocument

.htaccess
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) — самый простой вариант. Он сравнивает начало пути и подставляет остаток к новому адресу.

apache
# одна страница
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 пишется без начальной косой черты.

apache
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

bash
# формат 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). Он срабатывает при каждом показе страницы ошибки и фиксирует адрес, реферер и признаки бота.

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 не читает. Проверьте также синтаксис и расположение файла.

Читайте также