Многие используют для защиты своих сайтов на 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 – нужно, чтобы были выполнены следующие условия:
- В блоке «Основные настройки» (Global Settings) должно быть включено «Allow iThemes Security to write to wp-config.php and .htaccess.»
- Должен быть включен модуль «Заблокированные пользователи» (Banned Users)
- В блоке «Заблокированные пользователи» должен быть активирован бан-лист «Enable Ban Lists»
- Там же должен быть непустой список хостов «Запретить доступ хостам» (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
.
Готово.