Справочник

Почему .htaccess не работает: ошибка 500, 403 или правила без эффекта

Если правила из .htaccess ничего не меняют, сначала выясните, читает ли сервер этот файл. Если после правки сайт выдаёт ошибку 500 или 403, найдите запись в журнале ошибок и сверьте её с таблицей на этой странице.

≈ 12 мин чтения
Содержание 13

Что сделать прямо сейчас

  1. Если после правки сайт отвечает ошибкой 500, верните сохранённую копию .htaccess или уберите добавленные строки — сайт заработает как раньше.
  2. Выясните, на чём работает сайт: nginx файлы .htaccess не читает — как понять.
  3. Проверьте, читает ли сервер файл, — лишним словом.
  4. Найдите запись в журнале ошибок и сверьте её с таблицей.

Что видите и где причина

Что видитеГде причина
ошибка 500 на всех страницах после правкиошибка в строках .htaccess — что значит запись в журнале
ответ 403 после правкистроки запрета или параметры Options — разбор
правила ничего не меняют, ошибки нетсервер не читает файл или правило не срабатывает — проверка лишним словом
страницы переадресуются, а картинки и стили нетв справке Beget сказано, что правила из .htaccess работают только для динамических данных — подробнее
браузер ведёт по старой переадресациибраузер запомнил ответ 301 — проверьте через curl
ERR_TOO_MANY_REDIRECTSпереадресации по кругу — разбор ошибки
сайт работает на nginxnginx не читает .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 не знает:

  1. Перед правкой сохраните копию файла .htaccess к себе на компьютер: если что-то пойдёт не так, её можно будет вернуть.
  2. Впишите первой строкой файла .htaccess слово proverka123 и сохраните файл.
  3. Откройте страницу сайта, которую собирает PHP или CMS, — не картинку и не файл стилей. Если появилась ошибка 500, сервер файл читает: уберите слово и ищите причину в самих правилах — правила без ошибки, но не действуют.
  4. Если страница открылась как раньше, сервер файл не читает. Уберите слово и проверьте имя и место файла и не работает ли сайт на 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_flagPHP подключён к 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 — как это сделать.

Источники

Сверено 15 октября 2026 года.

Что почитать дальше