В настоящее время у меня проблема с попыткой защитить паролем каталог, который находится внутри каталога, в котором работает WordPress. Это для каталога с именем «admin», который обрабатывает некоторые вещи вне WP.
В моем файле WordPress .htaccess я установил правило игнорировать этот каталог.
RewriteEngine On
RewriteBase /
RewriteRule ^(admin|index\.php)$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
Когда я перехожу в свою административную директорию, все работает нормально, и я могу видеть то, что я должен видеть (базовые вещи PHP).
Однако, когда я пытаюсь защитить этот каталог паролем, помещая туда файлы .htaccess и .htpassword, я получаю ошибку 404 WordPress. Вот как это выглядит:
AuthUserFile /home/myuser/public_html/admin/.htpasswd
AuthName "Password Protected Area"
AuthType Basic
<limit GET POST>
require valid-user
</limit>
Это (очевидно) имеет какое-то отношение к строке "require valid-user". Этот конкретный файл .htaccess / .htpasswd отлично работал на аналогичном сервере.
Есть предположения?
Старый вопрос, но ...
RewriteRule ^(admin|index\.php)$ - [L]
Эта директива только «игнорирует» URL /admin
(без слеша в конце). Таким образом, он не будет исключать запросы на файлы внутри /admin
подкаталог или даже /admin
каталог, так как mod_dir добавит косую черту по умолчанию через 301 редирект, т.е. /admin/
. (В Apache 2.2 также вероятно, что mod_dir выдает внутренний подзапрос для индекса каталога, прежде чем mod_rewrite сможет обработать URL-адрес. В Apache 2.4 это поведение изменилось)
Директивы mod_rewrite в родительском .htaccess
затем перепишет запрос через WordPress. (Хотя вы ожидаете, что любые запросы на физические каталоги / файлы все равно будут игнорироваться?)
Вместо этого вам нужно будет изменить эту директиву на что-то вроде следующего:
RewriteRule ^(admin|index\.php$) - [L]
т.е. Просто переместите $
(привязка конца строки) в круглых скобках. Или создайте две отдельные директивы.
В качестве альтернативы вы можете просто включить (или отключить) механизм перезаписи внутри /admin/.htaccess
файл, чтобы переопределить директивы mod_rewrite (фронт-контроллер WordPress) в родительском .htaccess
файл:
RewriteEngine Off
Директивы mod_rewrite не наследуются по умолчанию, поэтому простого включения (или отключения) механизма перезаписи в дочерней конфигурации достаточно, чтобы переопределить родительский.
Закройте браузер и попробуйте подключиться. Возможно, у вас есть кешированные учетные данные, которые используются.
Если у вас есть несколько защищенных каталогов с разными паролями, используйте разные значения для Authname
.
EDIT: попробуйте переместить Require за пределы оператора Limit. Я всегда группирую определения Auth с оператором Require в одном блоке.
Похоже, ваша ошибка указывает на то, что запрошенный ресурс не существует или не читается. Попробуйте удалить изменения перезаписи для admin
. Стандартные правила перезаписи хорошо работают с каталогами и файлами, смешанными с установкой Wordpress.
Вы можете использовать блок LimitExcept вместо блока Limit для предотвращения доступа, отличного от GET или POST. Это мой рабочий файл .htaccess.
AuthType Basic
AuthName "Restricted Access"
AuthUserFile /etc/wordpress/htpasswd
Require Valid-User
<LimitExcept GET POST>
Order allow,deny
Deny from all
</LimitExcept>
Убедитесь, что файлы .ht * доступны для чтения веб-сервером. Я тестирую несанкционированный доступ, изменяя идентификатор пользователя в htpasswd
файл на тот, который я не использовал.