Если вы используете 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