Подтвердить что ты не робот

Htaccess исключает один URL из Basic Auth

Мне нужно исключить один 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 
4b9b3361

Ответ 1

Если вы используете 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 / 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 ession здесь: https://httpd.apache.org/docs/2.4/expr.html

Ответ 2

Используя 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

Разрешающая/запрещающая часть директив говорит, что запретить доступ для КАЖДОГО, за исключением случаев, когда существует допустимый пользователь (успешный вход в систему BASIC auth) или если установлена ​​переменная noauth.

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

<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>

Ответ 6

Добавьте ниже код в свой файл htaccess root и не забудьте изменить страницу admin url,.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.

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

Ответ 7

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

# 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

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

Пример:

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

Ответ 8

почему бы вам просто не использовать базовый auth так, как он был предназначен?

user:[email protected]/callbacks/etc