Apache: правила .htaccess не действуют
Правила в .htaccess применяются только если это разрешено в основной конфигурации. По умолчанию во многих сборках переопределение запрещено целиком, и файл просто не читается — без ошибок и предупреждений.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Переопределение запрещено
Параметр
AllowOverride Noneв блоке каталога отключает чтение .htaccess. Это сделано ради скорости и безопасности. -
Не включён модуль, нужный для директив
Правила переадресации требуют модуля переписывания адресов. Без него директивы вызывают ошибку или игнорируются.
-
Файл недоступен для чтения
Права на .htaccess или на каталог не позволяют серверу прочитать файл. Сообщение об этом попадает в журнал ошибок.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Разрешено ли переопределение и где.
sudo grep -rn "AllowOverride" /etc/apache2/ | grep -v "#"Сообщения о чтении файла и ошибках в нём.
sudo tail -30 /var/log/apache2/error.log | grep -i htaccessРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Параметр
AllowOverride Noneв блоке каталога отключает чтение .htaccess. Это сделано ради скорости и безопасности.
- Как проверить
-
Посмотрите действующее значение для нужного каталога.
sudo apache2ctl -S 2>/dev/null | head sudo grep -rn "AllowOverride" /etc/apache2/ | grep -v "^.*#"
- Как исправить
-
Разрешите нужные виды переопределения для конкретного каталога, а не для всего сервера.
# <Directory /var/www/site> # AllowOverride FileInfo Options # </Directory>
- Почему происходит
- Правила переадресации требуют модуля переписывания адресов. Без него директивы вызывают ошибку или игнорируются.
- Как проверить
-
Посмотрите включённые модули.
sudo apache2ctl -M 2>/dev/null | grep -iE "rewrite|headers"
- Как исправить
-
Включите нужный модуль и перезапустите службу.
sudo a2enmod rewrite && sudo systemctl restart apache2
- Почему происходит
- Права на .htaccess или на каталог не позволяют серверу прочитать файл. Сообщение об этом попадает в журнал ошибок.
- Как проверить
-
Посмотрите права и журнал.
ls -l /var/www/site/.htaccess sudo tail -20 /var/log/apache2/error.log | grep -i htaccess
- Как исправить
- Дайте права на чтение пользователю веб-сервера: обычно достаточно 0644.
Пример вывода
Переопределение запрещено, файл не читается. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ sudo grep -rn "AllowOverride" /etc/apache2/apache2.conf | head -2
172: AllowOverride None
$ sudo tail -2 /var/log/apache2/error.log
# пусто: файл .htaccess даже не открывается
Связанные ошибки
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
- Permission denied в журнале службы Отказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
- Apache: could not bind to address Apache не занимает порт: конфликт с nginx, порт занят, нет прав на привилегированный порт.
- Apache: конфликт модулей многопроцессности и PHP Apache не запускается после включения модуля PHP: несовместимость с выбранным модулем многопроцессности.
- Configuration file is marked world-inaccessible Предупреждение о правах на unit-файл: служба работает, но файл недоступен для чтения другим.
- Docker: unable to configure the Docker daemon with file daemon.json Демон Docker не запускается из-за ошибки в /etc/docker/daemon.json: неверный JSON или неизвестный ключ.
- Docker: unable to configure the Docker daemon — конфликт -H и hosts Адрес прослушивания задан дважды: ключом -H в unit-файле и параметром hosts в daemon.json. Демон отказывается стартовать.
- Failed with result «success»: странное сочетание в журнале Служба помечена упавшей с результатом «успех»: разбор этого сочетания и когда оно нормально.
Где встречается чаще всего
Источники
- Документация Apache: AllowOverride
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Проверено на apache2 из пакетов Ubuntu: по умолчанию переопределение запрещено.