htaccess исключает один URL из Basic Auth - PullRequest
70 голосов
/ 24 января 2012

Мне нужно исключить один URL (или, что еще лучше, один префикс) из обычной защиты htaccess Basic Auth.Что-то вроде /callbacks/myBank или /callbacks/.* У вас есть какие-нибудь советы, как это сделать?

Что я не ищу, так это как исключить файл.Это должен быть URL-адрес (поскольку это решение основано на PHP-фреймворке, и все URL-адреса перенаправляются с mod_rewrite на index.php).Таким образом, нет файла под этим URL.Ничего.

Некоторые из этих URL-адресов являются просто обратными вызовами от других служб (IP не известен, поэтому я не могу исключить на основе IP), и они не могут запрашивать имя пользователя / пароль.

Текущее определениетак просто, как:

AuthName "Please login."
AuthGroupFile /dev/null
AuthType Basic
AuthUserFile /xxx/.htpasswd
require valid-user 

Ответы [ 8 ]

80 голосов
/ 24 января 2012

Используя SetEnvIf , вы можете создать переменную, когда запрос начинается с некоторого пути, а затем использовать директиву Satisfy Any, чтобы избежать необходимости входа в систему.

# set an environtment variable "noauth" if the request starts with "/callbacks/"
SetEnvIf Request_URI ^/callbacks/ noauth=1

# the auth block
AuthName "Please login."
AuthGroupFile /dev/null
AuthType Basic
AuthUserFile /xxx/.htpasswd

# Here is where we allow/deny
Order Deny,Allow
Satisfy any
Deny from all
Require valid-user
Allow from env=noauth

Блок директив allow / deny говорит, что запрещает доступ для EVERYONE , за исключением случаев, когда существует valid-user (успешный вход в систему с BASIC-аутентификацией) или переменная noauth установлен.

46 голосов
/ 11 ноября 2015

Если вы используете Apache 2.4, обходные пути SetEnvIf и mod_rewrite больше не нужны, поскольку директива Require может интерпретировать выражения напрямую:

AuthType Basic
AuthName "Please login."
AuthUserFile "/xxx/.htpasswd"

Require expr %{REQUEST_URI} =~ m#^/callbacks/.*#
Require valid-user

Apache 2.4 обрабатывает директивы Require, которые не сгруппированы по <RequireAll>, как если бы они были в <RequireAny>, который ведет себя как оператор "или". Вот более сложный пример, который демонстрирует сопоставление как URI запроса, так и строки запроса, а также требует наличия действительного пользователя:

AuthType Basic
AuthName "Please login."
AuthUserFile "/xxx/.htpasswd"

<RequireAny>
    <RequireAll>
        # I'm using the alternate matching form here so I don't have
        # to escape the /'s in the URL.
        Require expr %{REQUEST_URI} =~ m#^/callbacks/.*#

        # You can also match on the query string, which is more
        # convenient than SetEnvIf.
        #Require expr %{QUERY_STRING} = 'secret_var=42'
    </RequireAll>

    Require valid-user
</RequireAny>

В этом примере будет разрешен доступ к /callbacks/foo?secret_var=42, но потребуется имя пользователя и пароль для /callbacks/foo.

Помните, что если вы не используете <RequireAll>, Apache будет пытаться сопоставить каждый Require в порядке , поэтому сначала подумайте, какие условия вы хотите разрешить.

Ссылка на директиву Require находится здесь: https://httpd.apache.org/docs/2.4/mod/mod_authz_core.html#require

И ссылка на сочинение expr здесь: https://httpd.apache.org/docs/2.4/expr.html

6 голосов
/ 14 февраля 2013

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

SetEnvIfNoCase Request_URI "^/status\.php" noauth

AuthType Basic
AuthName "Identify yourself"
AuthUserFile /path/to/.htpasswd
Require valid-user

Order Deny,Allow
Deny from all
Allow from env=noauth

Satisfy any
1 голос
/ 22 декабря 2016

Я пробовал другие решения, но это то, что у меня сработало. Надеюсь, это поможет другим.

# Auth stuff
AuthName "Authorized personnel only."
AuthType Basic
AuthUserFile /path/to/your/htpasswd/file

SetEnvIf Request_URI "^/index.php/api/*" allow
Order allow,deny
Require valid-user
Allow from env=allow
Deny from env=!allow
Satisfy any

Это позволит открывать URL-адрес API и любую строку URL-адреса после /index.php/api/ без необходимости входа в систему, а все остальное будет предложено войти в систему.

Пример:

mywebsite.com/index.php/api откроется без запроса входа mywebsite.com/index.php/api/soap/?wsdl=1 откроется без приглашения войти в систему mywebsite.com будет предложено сначала войти в систему

1 голос
/ 21 июня 2013
<location />
        SetEnvIf Request_URI "/callback/.*" REDIRECT_noauth=1

        AuthType Basic
        AuthName "Restricted Files"
        AuthUserFile /etc/httpd/passwords/passwords
        Order Deny,Allow
        Satisfy any
        Deny from all
        Allow from env=REDIRECT_noauth
        Require user yournickname
</location>
0 голосов
/ 03 ноября 2017

почему бы вам просто не использовать базовую аутентификацию так, как это было задумано?

user:password@domain.com/callbacks/etc
0 голосов
/ 19 апреля 2016

Добавьте приведенный ниже код в корневой файл htaccess и не забудьте изменить адрес администратора, страницу файла .htpasswd.

<Files "admin.php">
        AuthName "Cron auth"
        AuthUserFile E:\wamp\www\mg\.htpasswd
        AuthType basic
        Require valid-user
    </Files>

Создайте файл .htpasswd в корневой папке и добавьте ниже имя пользователя и пароль.(установите имя пользователя по умолчанию: admin и пароль: admin123)

admin:$apr1$8.nTvE4f$UirPOK.PQqqfghwANLY47.

Пожалуйста, дайте мне знать, если у вас все еще есть какие-либо проблемы.

0 голосов
/ 17 февраля 2013

Другой подход работает следующим образом, если область, которую вы защищаете, имеет монолитный PHP-скрипт, управляющий всем, как Wordpress. Настройте Аутентификацию в другом каталоге. Поместите туда index.php, который устанавливает cookie по пути '/'. Затем в Wordpress (например), проверьте куки, но обойдите проверку, если $ _SERVER ['REQUEST_URI'] является исключенным URL.

На моей платформе общего хостинга RewriteRule не смог установить переменную среды, которая работала с "Satisfy any".

При любом подходе следите за тем, чтобы защищаемая вами страница не содержала изображений, таблиц стилей и т. Д., Которые инициируют запрос на аутентификацию, если на самой странице этого нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...