Разбор .htaccess
Вставьте файл, и к каждой строке появится фраза о том, что она делает. Шаблоны перезаписи разбираются по частям, а правила, похожие на известные заражения, помечаются для проверки.
Настройки, которые живут в папке
У веб-сервера есть главный файл конфигурации, который правит только администратор. На виртуальном хостинге администратор не вы, поэтому 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 в родительских папках и главную конфигурацию, а все это меняет результат. Метка означает «выясните, кто это добавил», и легальные плагины иногда ее тоже вызывают. Файл без меток не доказывает, что сайт чист.
Если строка помечена, а вы ее не писали
- Скачайте копию файла как улику, прежде чем что-либо трогать.
- Посмотрите дату изменения файла и поищите другие файлы, измененные в то же время, особенно PHP-файлы в папках загрузок и имена из помеченных правил.
- Удалите вредные строки и через несколько минут откройте файл снова. Если они вернулись, файл переписывает скрипт на сервере, и одного удаления строк мало.
- Смените пароли хостинга, FTP или SSH, базы данных и администратора CMS, затем обновите CMS со всеми плагинами и темами.
- Запустите проверку опасных сайтов, чтобы узнать, не попал ли сайт в черный список браузеров, и трассировку редиректов, чтобы убедиться, что посетители попадают куда нужно.
Частые вопросы
Где находится файл .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.
Отправляется ли вставленный файл на ваш сервер?
Нет. Анализ выполняет скрипт в вашем браузере. И все же возьмите за привычку убирать пароли и секретные ключи из всего, что вставляете на веб-страницу.