#Что означает ошибка
mod_rewrite не работает, ЧПУ дают 404
Если ЧПУ на Apache дают 404 и .htaccess не действует, модуль mod_rewrite отключён или Apache не разрешает переопределение настроек (AllowOverride None).
Исправление занимает несколько минут и требует перезапуска Apache.
Если ЧПУ не работают, включите mod_rewrite и разрешите AllowOverride All для каталога сайта.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Модуль выключенmod_rewrite. | 404. | a2enmod rewrite. |
| AllowOverride NoneКонфиг. | .htaccess игнорируется. | Измените на All. |
| Ошибка правилRewriteRule. | 404. | Проверьте. |
| Нет .htaccessФайл. | 404. | Создайте. |
#Пошаговое решение
- Включите mod_rewriteДля Apache на Debian/Ubuntu откройте SSH-терминал и выполните
apache2ctl -M | grep rewrite; на RHEL используйтеhttpd -M. Если модуль отсутствует и вы управляете сервером, на Debian выполнитеsudo a2enmod rewriteпосле копии конфигурации; на виртуальном хостинге обратитесь к поддержке, так как модуль управляется провайдером. - Разрешите AllowOverride AllНайдите
DocumentRootчерезapachectl -Sи откройте связанный<Directory>. Для WordPress обычно необходима поддержка правил.htaccess(AllowOverride FileInfoили эквивалент, иногда All по требованиям проекта); не включайте All глобально для чужих сайтов. Сохраните конфигурацию и проверьте, что корень соответствует реальному каталогу WordPress. - Проверьте синтаксисОткройте корневой
.htaccessсайта в файловом менеджере и сравните правила переписывания с официальным образцом вашей CMS. ПроверьтеRewriteBaseдля установки в подкаталоге и наличиеRewriteRuleнаindex.php. Перед заменой сохраните исходные правила безопасности и редиректов, не перезаписывайте их целиком шаблоном. - Перезапустите ApacheПосле правок выполните
sudo apachectl configtestи приSyntax OK—sudo systemctl reload apache2(либоhttpdна RHEL). Перезапуск всей системы не требуется. Если модуль уже активен, но 404 остаётся, переходите к журналу и настройке постоянных ссылок самой CMS. - Проверьте журналВ журнале Apache ищите
File does not exist,AH...и путь реального файла при запросе ЧПУ. В WordPress откройте «Настройки → Постоянные ссылки» и нажмите «Сохранить». Проверьте две записи и действительно отсутствующий URL: ошибка 404 для несуществующей страницы должна сохраниться.
#Включение модуля
Debian/Ubuntu: sudo a2enmod rewrite и sudo systemctl restart apache2. CentOS/RHEL: убедитесь, что в httpd.conf есть строка LoadModule rewrite_module modules/mod_rewrite.so, и перезапустите sudo systemctl restart httpd. Проверьте список модулей: apachectl -M | grep rewrite.
#AllowOverride
В конфигурации виртуального хоста для каталога сайта укажите <Directory /var/www/site> AllowOverride All Require all granted </Directory>. Без AllowOverride All файл .htaccess игнорируется. Проверка синтаксиса: apachectl configtest. Файл .htaccess должен лежать в корне сайта и называться точно так.
#Проверка правил
Минимальный пример: RewriteEngine On, RewriteCond %{REQUEST_FILENAME} !-f, RewriteCond %{REQUEST_FILENAME} !-d, RewriteRule ^(.*)$ index.php [L,QSA]. Журнал ошибок /var/log/apache2/error.log покажет проблемы. Для отладки включите LogLevel alert rewrite:trace3. Документация: .
sudo apache2ctl -M | grep rewritesudo apache2ctl configtest# После успешного теста: sudo systemctl reload apache2#Типичные причины 404 и 500 после включения
Ошибка 500 после добавления .htaccess чаще всего означает синтаксическую ошибку или недоступную директиву: журнал error.log указывает строку. Ошибка 404 на всех, кроме главной, страницах — не включён AllowOverride или используется RewriteBase с неверным путём. Если сайт лежит в подкаталоге, укажите RewriteBase /подкаталог/. В WordPress пересоздайте правила, сохранив «Настройки → Постоянные ссылки». Проверьте, что нет конфликта с правилами в основной конфигурации Apache и что Apache запущен под пользователем, имеющим право читать .htaccess.