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
Ответы
Ответ 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