#Что означает ошибка
404 при ЧПУ
Apache берёт правила перезаписи из файла .htaccess, но только если включён модуль mod_rewrite и директива AllowOverride разрешает переопределять настройки в каталоге сайта. Если любое из условий не выполнено, правила игнорируются, Apache ищет файл /novost/ на диске и отвечает 404. Главная страница при этом открывается, а внутренние — нет.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
Модуль отключёнmod_rewrite не включён. | Команда apachectl -M не показывает rewrite_module. | sudo a2enmod rewrite. |
AllowOverride NoneКаталог сайта запрещает использование .htaccess. | Правила в .htaccess не работают. | Поставьте AllowOverride All. |
| Нет файла .htaccessФайл не создан или удалён. | В корне сайта нет .htaccess. | Сохраните ЧПУ в WordPress или создайте файл. |
Права и владелецWordPress не может записать .htaccess. | В админке предлагают вручную добавить правила. | Дайте права или создайте файл вручную. |
#Пошаговое решение
- Проверьте модульПодключитесь к серверу Apache по SSH и выполните
apachectl -M | grep rewrite(илиapache2ctl -M). Еслиrewrite_moduleесть, модуль активен и включать его повторно не нужно. На Debian/Ubuntu при отсутствии модуля администратор может использоватьsudo a2enmod rewriteи проверить конфигурацию. - Включите AllowOverrideВ файле виртуального хоста найдите
DocumentRootи связанный блок<Directory>сAllowOverride. Для сайта WordPress разрешите необходимые директивы.htaccessлишь в его каталоге; не ставьтеAllowOverride Allглобально для всей файловой системы. - Создайте .htaccessОткройте
.htaccessв корне WordPress, сохраните копию и проверьте стандартный блок# BEGIN WordPressвместе с правиламиRewriteEngine OnиRewriteRule. Если WordPress в подкаталоге, путь может отличаться; не удаляйте остальные правила безопасности и перенаправлений при замене. - Пересохраните постоянные ссылкиВ WordPress войдите «Настройки → Постоянные ссылки», выберите нужную структуру и нажмите «Сохранить изменения». Затем откройте несколько записей: если форма работает, но страницы всё ещё 404, исследуйте фактические правила Apache и статус URL.
- Проверьте конфигурациюПосле изменения модуля/виртуального хоста выполните
sudo apachectl configtest, убедитесь вSyntax OK, затемsudo systemctl reload apache2(илиhttpdна RHEL). Не перезапускайте все службы хостинга ради обычной правки ЧПУ. - Проверьте журналВ error.log Apache найдите ошибки при запросе записи: неправильный
DocumentRoot, запрет.htaccess, отсутствие index.php или цикл перезаписи. Исправьте конкретную причину, а не перенаправляйте все 404 на главную; несуществующие страницы должны продолжать возвращать HTTP 404.
#Конфигурация
<Directory /var/www/html>
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>sudo apachectl configtest# При Syntax OK: sudo systemctl reload apache2# Для RHEL служба называется httpd.Если вы используете Apache вместе с nginx в роли прокси, учитывайте, что .htaccess работает только на уровне Apache; запросы, обработанные nginx напрямую (например, статика), правила не затрагивают. Для высоконагруженных сайтов вместо .htaccess лучше размещать правила прямо в конфигурации виртуального хоста — это быстрее. Подробности — в .
Проверить, какие правила реально применяются, поможет временная диагностика: добавьте в начало .htaccess строку RewriteRule ^proverka-rewrite$ /index.php [L,R=302] и откройте /proverka-rewrite — редирект сработает только если .htaccess читается и mod_rewrite включён. Если при этом в журнале появляется AH00124: Request exceeded the limit of 10 internal redirects, значит, правила зациклены: проверьте RewriteBase и дубли блока WordPress (после переносов он иногда встречается дважды). На хостингах с PHP как CGI/FPM и nginx перед Apache .htaccess тоже работает, но только в части, которую обслуживает Apache.