Почему .htaccess не работает: ошибка 500, 403 или правила без эффекта
Если правила из .htaccess ничего не меняют, сначала выясните, читает ли сервер этот файл. Если после правки сайт выдаёт ошибку 500 или 403, найдите запись в журнале ошибок и сверьте её с таблицей на этой странице.
Содержание 13
Что сделать прямо сейчас
- Если после правки сайт отвечает ошибкой 500, верните сохранённую копию .htaccess или уберите добавленные строки — сайт заработает как раньше.
- Выясните, на чём работает сайт: nginx файлы .htaccess не читает — как понять.
- Проверьте, читает ли сервер файл, — лишним словом.
- Найдите запись в журнале ошибок и сверьте её с таблицей.
Что видите и где причина
| Что видите | Где причина |
|---|---|
| ошибка 500 на всех страницах после правки | ошибка в строках .htaccess — что значит запись в журнале |
| ответ 403 после правки | строки запрета или параметры Options — разбор |
| правила ничего не меняют, ошибки нет | сервер не читает файл или правило не срабатывает — проверка лишним словом |
| страницы переадресуются, а картинки и стили нет | в справке Beget сказано, что правила из .htaccess работают только для динамических данных — подробнее |
| браузер ведёт по старой переадресации | браузер запомнил ответ 301 — проверьте через curl |
| ERR_TOO_MANY_REDIRECTS | переадресации по кругу — разбор ошибки |
| сайт работает на nginx | nginx не читает .htaccess — перенесите правила |
Сайт работает на nginx
nginx не читает файлы .htaccess: настройки он берёт только из своих файлов и применяет их после перезагрузки настроек или перезапуска. Поэтому на сайте с nginx правила из .htaccess не работают и не дают никакой ошибки — их нужно перенести в настройки nginx: .htaccess в nginx.
Если вы настраивали свой VPS по инструкции Как разместить сайт на VPS, сайт работает на nginx. Если ставили Apache по статье Как установить Apache на Ubuntu, .htaccess читает Apache, но сначала чтение нужно разрешить — как разрешить .htaccess.
На виртуальном хостинге о .htaccess пишут в справке хостинга: статьи есть у Timeweb, Beget, Рег.ру и Спринтхоста — ссылки в источниках. Если в справке вашего хостинга о .htaccess ничего нет, спросите поддержку, читает ли сервер этот файл.
Имя и место файла
- Имя — ровно
.htaccess, маленькими буквами: с точкой в начале и без .txt в конце. Проверьте имя в файловом менеджере панели хостинга; на своём сервере список файлов вместе со скрытыми покажетls -a— про ls. - Файл лежит в корневой папке сайта или в той папке, на которую должен действовать, — где лежит файл. Правила действуют на свою папку и вложенные, поэтому файл в подпапке не затронет остальной сайт.
- Если файла не видно, включите показ скрытых файлов — как это сделать.
- Блокнот Windows может добавить в начало файла невидимую метку BOM, и сервер может прочитать файл неправильно. Timeweb советует править .htaccess в файловом менеджере панели или в Notepad++.
Проверка лишним словом
Читает ли сервер файл, можно проверить способом из документации Apache — словом, которого Apache не знает:
- Перед правкой сохраните копию файла .htaccess к себе на компьютер: если что-то пойдёт не так, её можно будет вернуть.
- Впишите первой строкой файла .htaccess слово
proverka123и сохраните файл. - Откройте страницу сайта, которую собирает PHP или CMS, — не картинку и не файл стилей. Если появилась ошибка 500, сервер файл читает: уберите слово и ищите причину в самих правилах — правила без ошибки, но не действуют.
- Если страница открылась как раньше, сервер файл не читает. Уберите слово и проверьте имя и место файла и не работает ли сайт на nginx, а на своём VPS — как разрешить .htaccess.
Картинку или файл стилей для проверки не берите: в справке Beget сказано, что правила из .htaccess работают только для динамических данных — подробнее.
Что значат сообщения в журнале
Ошибка в строке .htaccess даёт ошибку 500 на страницах этой папки и вложенных, а в журнал ошибок попадает запись о ней. На хостинге журнал ищите в панели или спросите о нём поддержку. На своём VPS журнал покажет команда ниже. Команды вводятся на сервере: подключитесь к нему по SSH (как подключиться) и набирайте их в том же окне. Если система спросит пароль, введите пароль своего пользователя на сервере. Символы при вводе не видны — наберите пароль и нажмите Enter.
sudo tail -n 50 /var/log/apache2/error.logКоманда покажет последние 50 строк журнала, свежие записи — внизу. Найдите в них слова или код из левой колонки:
| Что в записи | Что это значит и что делать |
|---|---|
Invalid command 'RewriteEngine', perhaps misspelled… или то же с RewriteRule, RewriteCond | выключен модуль rewrite: на своём VPS включите его, на хостинге спросите поддержку |
| то же с Header | выключен модуль headers — включается так же |
| то же с ExpiresActive или ExpiresByType | выключен модуль expires — включается так же |
| то же с php_value или php_flag | PHP подключён к Apache не модулем — когда эти строки работают |
| то же с другим словом | опечатка в имени директивы или выключен её модуль: сверьте строку с примером |
| в записи есть слова not allowed | директиву нельзя писать в .htaccess или её группу не разрешает AllowOverride: на своём VPS — как разрешить .htaccess, на хостинге спросите поддержку; строки php_admin_value и php_admin_flag уберите |
после имени директивы другая причина, например RewriteCond: bad flag delimiters | ошибка в записи самой строки — сверьте её с примером |
| код AH00529 | сервер не может прочитать .htaccess, ответ 403 — права на файлы |
| код AH00124 | адрес переписывается по кругу, ответ 500 — петля и ошибка 500 |
| код AH00670 | выключен параметр FollowSymLinks, и RewriteRule в папке запрещены, ответ 403 — разбор |
Правила без ошибки, но не действуют
- Нет строки
RewriteEngine On: без неё правила RewriteRule не выполняются. - Правила стоят внутри блока
<IfModule …>, а модуль выключен: такой блок Apache пропускает без ошибки. На своём VPS включите модуль, на хостинге спросите поддержку. - Путь в RewriteRule начинается с косой черты: в .htaccess правило видит путь без неё — пишите
^blog/, а не^/blog/. В строке Redirect, наоборот, путь начинается с косой черты — 301 в .htaccess. - Раньше сработало другое правило с флагом L или END: поставьте своё правило выше него.
- Во вложенной папке есть свой .htaccess со строками mod_rewrite: правила верхней папки для неё не работают — что делать.
- Браузер запомнил прежнюю переадресацию 301 — проверьте через curl.
Ответ 403 после правки
- Строки Require, Deny или Allow закрыли доступ и вам — сверьте их со статьёй Запрет доступа в .htaccess.
- Строка
Options -Indexesв папке без индексного файла: вместо списка файлов сервер отвечает 403 — так и задумано (подробнее). - Строка Options без знаков плюс и минус заменяет весь набор параметров: например,
Options Indexesвыключает FollowSymLinks. Тогда RewriteRule в этой папке запрещены: сервер отвечает 403, а в журнале появляется запись с кодом AH00670. Пишите параметры со знаками — как в примере. - В журнале запись с кодом AH00529 — сервер не может прочитать .htaccess: проверьте права на файлы.
Как проверить
В терминале компьютера (как открыть терминал, про curl) запросите адрес, который должно затронуть правило, — например, старую страницу с переадресацией:
curl -I https://example.com/old-page/- В ответе код 301 или 302 и строка Location с новым адресом — правило работает. curl может показать Location маленькими буквами.
- Ответ 200 без строки Location — правило не сработало: причины.
- Ответ 500 или 403 — найдите запись в журнале: что она значит.
curl не запоминает переадресации, а браузер ответ 301 запоминает и может вести по старому правилу. Если curl показывает новое, а браузер старое, очистите кэш браузера.
На хостинге
В справке Beget о подключении SSL, в части про переадресацию на HTTPS, сказано, что правила из .htaccess работают только для динамических данных. Динамические — это страницы, которые собирает PHP или CMS, поэтому картинки, стили и скрипты под такие правила могут не попасть. Для перехода на HTTPS у Beget есть переключатель в настройках сайта, он действует и на статические файлы — переключатель в панели хостинга.
В справке Спринтхоста сказано, что .htaccess домена действует и на его поддомены. Если поддомен из-за правил mod_rewrite отвечает ошибкой 500, Спринтхост советует положить в папку поддомена .htaccess со строкой RewriteEngine off. Там же сказано, что ошибку 500 дают неверные директивы и посторонние символы в файле.
Если причину найти не удалось, напишите в поддержку хостинга: адрес страницы, время ошибки и строки, которые вы добавили.
На своём VPS
Команды вводятся на сервере: подключитесь к нему по SSH (как подключиться) и набирайте их в том же окне. Если система спросит пароль, введите пароль своего пользователя на сервере. Символы при вводе не видны — наберите пароль и нажмите Enter. В Ubuntu Apache по умолчанию не читает .htaccess — сначала разрешите его: как разрешить .htaccess.
Проверьте, включён ли модуль переадресаций:
sudo apache2ctl -M | grep rewriteВ ответе должна быть строка с rewrite. Если ответ пустой, включите модуль:
sudo a2enmod rewriteЗатем проверьте настройки: sudo apache2ctl configtest — в конце ответа должно быть Syntax OK — и примените их: sudo systemctl restart apache2. Если вместо Syntax OK пришла ошибка, Apache назовёт файл и номер строки: исправьте её и проверьте снова. Пока проверка не прошла, перезапуск не делайте.
Модули headers и expires проверяют и включают так же: в обеих командах вместо rewrite напишите headers или expires, затем проверьте и примените настройки.
Если ошибок нет, а правило не срабатывает, включите подробный журнал mod_rewrite — как это сделать.
Источники
- Документация Apache: файлы .htaccess — файл действует на свою папку и вложенные, читается при каждом запросе, при AllowOverride None не читается; проверка бессмысленным словом.
- Документация Apache: AllowOverride — по умолчанию None; группы AuthConfig, FileInfo, Indexes, Limit и Options; директива не из разрешённой группы даёт ошибку сервера.
- Документация Apache: Options — запись без плюса и минуса заменяет весь набор; Indexes показывает список файлов, если в папке нет индексного файла.
- Исходный код Apache 2.4.58: config.c — тексты Invalid command … и … not allowed here; ошибка в .htaccess даёт ответ 500, нечитаемый .htaccess — ответ 403 и запись AH00529.
- Документация Apache: mod_rewrite в .htaccess — путь без косой черты в начале; правило, которое переписывает адрес по кругу, даёт ошибку 500 и запись AH00124; флаг END; RewriteOptions Inherit; кэш браузера для 301.
- Документация Apache: RewriteEngine — по умолчанию off: без строки RewriteEngine On правила не выполняются.
- Документация Apache: IfModule — строки внутри блока выполняются, только если модуль загружен, иначе Apache их пропускает; блок можно писать в .htaccess.
- Исходный код Apache 2.4.58: mod_rewrite.c — без FollowSymLinks и SymLinksIfOwnerMatch mod_rewrite в .htaccess отвечает 403 и пишет в журнал AH00670.
- Файл apache2.conf из пакета apache2 в Ubuntu 24.04 — для /var/www/ — Options Indexes FollowSymLinks и AllowOverride None, имя файла .htaccess, запрет на файлы .ht*.
- Сценарий установки из пакета apache2 в Ubuntu 24.04 — модули, которые включаются при установке; rewrite, expires и headers в этом списке нет.
- Документация nginx: руководство для начинающих — изменения в файле настроек вступают в силу только после перезагрузки настроек или перезапуска nginx.
- Timeweb: создание и настройка .htaccess — Блокнот Windows может добавить метку BOM, и сервер может прочитать файл неправильно; советуют файловый менеджер панели или Notepad++.
- Спринтхост: файл .htaccess — .htaccess действует и на поддомены; неверные директивы и посторонние символы дают ошибку 500; строка RewriteEngine off для поддомена.
- Рег.ру: редирект с HTTP на HTTPS — правила переадресации на HTTPS в .htaccess для панелей cPanel и Plesk.
- Beget: SSL-сертификат на сайт — в части про переадресацию на HTTPS: правила из .htaccess работают только для динамических данных.
Сверено 15 октября 2026 года.
Что почитать дальше
- Файл .htaccessчто это, где лежит и как не сломать сайт.
- RewriteRule в .htaccessкак устроены правила mod_rewrite.
- Ошибка 500 Internal Server Errorдругие причины ошибки 500.
- .htaccess в nginxкуда перенести правила на сайте с nginx.