Назад | Перейти на главную страницу

Аутентификация Apache внутри установки WordPress

В настоящее время у меня проблема с попыткой защитить паролем каталог, который находится внутри каталога, в котором работает 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 файл на тот, который я не использовал.