Разбор .htaccess

Вставьте файл, и к каждой строке появится фраза о том, что она делает. Шаблоны перезаписи разбираются по частям, а правила, похожие на известные заражения, помечаются для проверки.

Ищите его в корневой папке сайта, обычно public_html, httpdocs или www. Поскольку имя начинается с точки, файловые менеджеры и FTP-программы скрывают его, пока вы не включите «показывать скрытые файлы».

Примеры

🔒 Your browser does the reading. The file is not uploaded.

Настройки, которые живут в папке

У веб-сервера есть главный файл конфигурации, который правит только администратор. На виртуальном хостинге администратор не вы, поэтому Apache дает другой путь. Это обычный текстовый файл с именем .htaccess, который кладут в папку сайта. Его инструкции действуют на эту папку и все, что ниже. Серверы LiteSpeed читают тот же файл. nginx его не читает и полностью игнорирует.

Сервер перечитывает файл при каждом запросе, поэтому изменение срабатывает в момент сохранения. Ошибка тоже. Одна опечатка в имени директивы, и все страницы отвечают ошибкой 500, пока вы не исправите строку. Перед каждой правкой сохраняйте копию.

Вы редко единственный автор. WordPress пишет свой блок между # BEGIN WordPress и # END WordPress, а плагины кэша, безопасности и изображений добавляют свои размеченные блоки. Разбор узнает метки примерно 25 из них, включая WP Rocket, LiteSpeed Cache, Wordfence и Really Simple SSL, и называет владельца каждого блока.

Как прочитать правило перезаписи вслух

Именно на mod_rewrite большинство и путается. Возьмем такую пару:

RewriteCond %{HTTP_HOST} ^shop\.example\.com$ [NC]
RewriteRule ^products/(\d+)$ https://www.example.com/item?id=$1 [R=301,L]

Читается это как фраза: «Если запрошенный хост shop.example.com, в любом регистре, а путь это products/ и цифры, навсегда отправить посетителя на новый адрес с этими цифрами в id и прекратить обработку».

  • RewriteCond это условие на переменную сервера. Оно относится только к следующему RewriteRule. Если их несколько подряд, все должны выполняться, если только одно не заканчивается на [OR].
  • Первая часть RewriteRule это регулярное выражение, которое проверяется на пути. Скобки захватывают текст, а $1, $2 вставляют его в адрес назначения. %1 берет захват из последнего условия.
ФлагДействие
LПоследнее правило этого прохода. END останавливает окончательно.
R=301Ответить редиректом. 301 постоянный, 302 временный. Без R перезапись внутренняя, и адресная строка посетителя не меняется.
NCНе различать заглавные и строчные буквы.
QSAСохранить исходную строку запроса и дописать ее.
F, GОтказать с 403 или ответить 410 Gone.
PПрокси: забрать содержимое с другого сервера и отдать как свое.

Что помечается

Взломщики, получившие право записи на сайт, часто берутся за .htaccess: несколько строк там могут перенаправлять посетителей или держать доступным скрытый скрипт. Разбор сравнивает каждую строку с шаблонами из реальных заражений и ставит одну из двух меток.

Подозрительно, красным:

  • редирект на другой домен, который срабатывает только для посетителей из поисковика или только для телефонов. Владелец, который набирает адрес прямо на компьютере, его никогда не видит;
  • отдельный PHP-скрипт, который отдается поисковым роботам;
  • AddHandler, AddType или SetHandler, которые заставляют изображения или текстовые файлы выполняться как PHP, а обычные файлы как CGI-скрипты;
  • php_value auto_prepend_file или auto_append_file, подгружающие файл до или после каждого скрипта, а также allow_url_include;
  • блок FilesMatch, запрещающий все файлы .php, .py и .exe, за которым идет блок, разрешающий короткий список PHP-файлов, которых нет в WordPress.

Проверить, оранжевым: строки внутри блока WordPress, не входящие в его стандартные правила, условия только для роботов или только по рефереру, флаг [P], страница ошибки на другом домене, включенный листинг каталогов, ошибки PHP, показанные посетителям, отключенный файрвол приложений, строки длиннее 400 символов или забитые base64 и закодированными символами, а также невидимые символы.

Отмечаются и две структурные ошибки, ведь обе дают 500: блок вроде <IfModule>, который так и не закрыт, и директивы, разрешенные только в главной конфигурации сервера, например DocumentRoot или <VirtualHost>.

Разбор читает текст. Он не выполняет правила, не знает, какие модули загружены на вашем сервере, и не видит другие файлы .htaccess в родительских папках и главную конфигурацию, а все это меняет результат. Метка означает «выясните, кто это добавил», и легальные плагины иногда ее тоже вызывают. Файл без меток не доказывает, что сайт чист.

Если строка помечена, а вы ее не писали

  1. Скачайте копию файла как улику, прежде чем что-либо трогать.
  2. Посмотрите дату изменения файла и поищите другие файлы, измененные в то же время, особенно PHP-файлы в папках загрузок и имена из помеченных правил.
  3. Удалите вредные строки и через несколько минут откройте файл снова. Если они вернулись, файл переписывает скрипт на сервере, и одного удаления строк мало.
  4. Смените пароли хостинга, FTP или SSH, базы данных и администратора CMS, затем обновите CMS со всеми плагинами и темами.
  5. Запустите проверку опасных сайтов, чтобы узнать, не попал ли сайт в черный список браузеров, и трассировку редиректов, чтобы убедиться, что посетители попадают куда нужно.

Частые вопросы

Где находится файл .htaccess?

В корневой папке сайта, которая часто называется public_html, httpdocs или www. У подпапок может быть свой. Имена, начинающиеся с точки, по умолчанию скрыты, поэтому включите «показывать скрытые файлы» в файловом менеджере хостинга или в FTP-клиенте.

Почему после правки .htaccess сайт выдает ошибку 500?

Apache останавливается на первой строке, которую не может понять. Обычно это опечатка в имени директивы, открытый и не закрытый блок, директива, которую хостинг не разрешает в .htaccess, или не установленный модуль. Верните свою копию и добавляйте изменения по одному.

Что значит [L,R=301] в RewriteRule?

R=301 говорит браузеру перейти на новый адрес и запомнить его как постоянный. L запрещает серверу применять к этому запросу другие правила перезаписи. Вместе это стандартный постоянный редирект.

Как понять, что файл .htaccess взломан?

Ищите правила, которых вы не добавляли: редиректы на незнакомые домены, условия на HTTP_REFERER или HTTP_USER_AGENT, обработчики, которые выполняют изображения как PHP, и auto_prepend_file. Сравните блок WordPress со стандартным. Эта страница помечает такие шаблоны за вас.

Работает ли .htaccess на nginx?

Нет. У nginx нет файлов конфигурации для отдельных папок. Администратор сервера должен перевести правила в его собственную конфигурацию. Некоторые хостинги ставят nginx перед Apache, и тогда .htaccess по-прежнему действует на запросы, которые доходят до Apache.

Отправляется ли вставленный файл на ваш сервер?

Нет. Анализ выполняет скрипт в вашем браузере. И все же возьмите за привычку убирать пароли и секретные ключи из всего, что вставляете на веб-страницу.