htaccess исключить один URL из базовой аутентификации


79

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

Ответы:


59

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


3
Мне пришлось удалить двойные кавычки вокруг выражения Require, чтобы оно работало на apache 2.4.7. В остальном все работало отлично.
Скотт Смит

Мне тоже пришлось удалить двойные кавычки, но это сработало отлично.
TMPilot

1
Не работает на моей установке Apache 2.4.10 / cakephp 3. Я хочу исключить / rest - виртуальный путь (правило перезаписи). Не могу понять, почему не работает.
Стефан Рихтер

3
@ stephan-richter Я подозреваю, потому что %{REQUEST_URI}значение - это переписанная строка. В случае с тортом 3 так и остается /webroot/index.php. Возможно, вам придется предложить альтернативный подход, такой как использование самого Cake для обработки аутентификации маршрутов.
beporter

Ты прав. Задал вопрос по этой проблеме и сам нашел ответ: stackoverflow.com/questions/41077895/…
Стефан Рихтер,

85

Используя 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 говорит, что запрещает доступ для ВСЕХ , за исключением случаев, когда есть действительный пользователь (успешный вход в систему с помощью BASIC auth) или если noauthпеременная установлена.


Я добавил этот раздел в <VirtualHost *: 80> DocumentRoot / var / www / Symfony / web / <Directory / var / www // Symfony / web>, но он не работает.
Vishal

Не могли бы вы объяснить, почему <Files> здесь не работает?
asdmin

1
Благодаря! Действительно выручил меня, будьте осторожны с случаем - у меня Order deny,allowне получилось. Что и говорить очень обидно!
Джеймс Ф,

2
может потребоваться Allow from env=REDIRECT_noauthдля перезаписи URL. Возможно, проблема в @vishal. Посмотрите здесь: [ stackoverflow.com/a/41092497/1285585]
Стефан Рихтер

2
Мне нужны обе строчки Allow from env=noauthи Allow from env=REDIRECT_noauthчтобы она работала.
CDuv

6

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

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

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

# 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

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

Пример:

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


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

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

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

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


0

Добавьте приведенный ниже код в корневой файл htaccess и не забудьте изменить 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.

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


0

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

user:password@domain.com/callbacks/etc

1
Ну, потому что а) никто действительно не хочет ™ данных аутентификации в строке URI, и б) потому что вполне вероятно, что OP не имеет возможности настроить вызов (поскольку он говорит об обратных вызовах из банка, я предполагаю, что он не может изменить поведение на стороне клиента)
frank42
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.