201712Сен

WordPress: конфликт iThemes Security и .htpasswd

Многие используют для защиты своих сайтов на WordPress отличный плагин iThemes Security (бывший Better WP Security). И как у многих разработчиков, он у меня установлен в стандартной сборке WP для новых сайтов. Новые вебсайты я сначала делаю на поддомене, а потом переношу на основной домен. И чтобы эти временные тестовые версии не попадали в индекс поисковых систем, я делаю аутентификацию по логину и паролю через файлы htaccess/htpasswd.

Обычного запрета на индексацию в robots.txt (Disallow: /) недостаточно, т.к. при этом тестовый сайт (а точнее, ссылка на него) все равно может попасть в индекс.

Пример:

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

При запароливании сайта через .htpasswd такой проблемы не возникает: любой обратившийся к сайту (будь то посетителей или поисковый робот) получит ошибку 401 Unauthorized. В этом случае ссылка на сайт вообще не попадает в индекс поисковиков.

Почему .htpasswd не работает при iThemes Security

Недавно случайно заметил, что авторизация через .htpasswd на тестовых сайтах не работает. В файл .htaccess ставил стандартный код:

AuthType basic
AuthName Admin
AuthUserFile /path/to/htpasswd/.htpasswd
Require valid-user

Ставил и до # BEGIN WordPress, и после # END WordPress, и искал какую-то информацию по проблеме в Google – ничего не помогало. По всем признакам авторизация должна была работать. Стало ясно, что дело не в самом WordPress.

Тогда я, естественно, подумал на iThemes Security, который вносил изменения в .htaccess. Отключение плагина помогло справиться с проблемой, но отрубить защиту – не вариант.

Как «подружить» iThemes Security и .htpasswd

После ряда манипуляций выяснилось, что просто установка и активация плагина не влияет на работу стандартного кода htpasswd в htaccess – нужно, чтобы были выполнены следующие условия:

  1. В блоке «Основные настройки» (Global Settings) должно быть включено «Allow iThemes Security to write to wp-config.php and .htaccess.»
  2. Должен быть включен модуль «Заблокированные пользователи» (Banned Users)
  3. В блоке «Заблокированные пользователи» должен быть активирован бан-лист «Enable Ban Lists»
  4. Там же должен быть непустой список хостов «Запретить доступ хостам» (Ban Hosts).

При таком раскладе в .htaccess появляется блок:

<IfModule mod_authz_core.c>
<RequireAll>
Require all granted
Require not env DenyAccess
Require not ip xx.xx.xx.xx
</RequireAll>
</IfModule>

который и мешает нормальной работе обычного кода htpasswd. Поможет простая манипуляция: обрамление нашего кода в <Files "*">...</Files>.

То есть:

<Files "*">
AuthType basic
AuthName Admin
AuthUserFile /path/to/htpasswd/.htpasswd
Require valid-user
</Files>

То есть требуем авторизации при обращении к любому файлу на сайте. Код можно вставить в любое место, например, в конец файла htaccess после строки # END WordPress.

Готово.

Freethinker.ru

Программные вопросы