У меня есть виртуальный хост с некоторыми ограничениями доступа, настроенными следующим образом:
<Location "/">
AuthType Basic
AuthName "Restricted Content"
AuthUserFile /var/www/domain/htdocs/.htpasswd
Require valid-user
</Location>
В дополнение к этому у меня есть следующий conf
-файл:
Alias /.well-known/acme-challenge/ "/var/www/letsencrypt/"
<Location /.well-known/acme-challenge/>
# Security Options
Options None
AllowOverride None
ForceType text/plain
RedirectMatch 404 "^(?!/\.well-known/acme-challenge/[\w-]{43}$)"
# Do not redirect to https or perform other rewrites
RewriteEngine off
</Location>
I необходимо, чтобы /. well-known / acme-challenge /
был доступен без аутентификации.
Я уже пробовал добавлять различные варианты Требовать все предоставленные
в мой conf
-файл, но безрезультатно.
Как сделать /. Well-known / acme-challenge /
доступным без аутентификации для всех виртуальных хостов? (Я не хочу изменять какие-либо виртуальные хосты, этот виртуальный хост является всего лишь примером).
Невозможно переопределить оператор
из вашего контекста виртуального хоста в контексте сервера. Из apache doc :
Разделы внутри
разделов применяются после соответствующие разделы вне определения виртуального хоста. Этот позволяет виртуальным хостам переопределять конфигурацию основного сервера.
Порядок объединения (побеждает последняя объединенная группа):
(кроме регулярных выражений) и .htaccess выполняется одновременно (с .htaccess, если разрешено, переопределение
)
(и
)
и
выполняется одновременно
и
выполняется одновременно
Кроме
, каждая группа обрабатывается в том порядке, в котором они указаны в файлах конфигурации.
не допускается внутри
, поэтому
является последним объединено.
Если вы обслуживаете сайт только на виртуальном хосте https (что было бы разумно из-за аутентификации), вы можете сделать следующее (не затрагивая свой виртуальный хост https):
<VirtualHost *:80>
ServerName example.com
Include letsencrypt-well-known.conf
RedirectMatch permanent ^(?!/\.well-known/acme-challenge/)(.*) "https://example.com$1"
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
DocumentRoot /var/www/html
<Location "/">
AuthType Basic
AuthName "Restricted Content"
AuthUserFile /var/www/domain/htdocs/.htpasswd
Require valid-user
</Location>
...
</VirtualHost>
letsencrypt-well-known.c onf
:
<IfModule mod_proxy.c>
ProxyPass /.well-known !
</IfModule>
Alias /.well-known/ /var/www/html/.well-known/
<Location /.well-known/acme-challenge>
Options None
Require all granted
</Location>
<Macro RedirectTo $protocol $domain>
<If "'${well_known_enabled}' == 'On' && %{REQUEST_URI} =~ m#^/\.well-known(/|$)#">
# Do nothing
</If>
<ElseIf "tolower(req('Host')) != '$domain' || tolower(%{REQUEST_SCHEME}) != '$protocol'">
Redirect permanent / $protocol://$domain/
</ElseIf>
</Macro>
<VirtualHost *:80>
ServerName example.com
Include letsencrypt-well-known.conf
RedirectTo https example.com
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
DocumentRoot /var/www/html
<Location "/">
AuthType Basic
AuthName "Restricted Content"
AuthUserFile /var/www/domain/htdocs/.htpasswd
Require valid-user
</Location>
...
</VirtualHost>
letsencrypt-well-known.conf
:
<IfModule mod_proxy.c>
ProxyPass /.well-known !
</IfModule>
Define well_known_enabled On
Define well_known_root "/var/www/html"
Alias /.well-known/ "${well_known_root}/.well-known/
<Directory "${well_known_root}/.well-known">
Options None
AllowOverride None
Require all granted
</Directory>
<Location /.well-known/acme-challenge>
Options None
Require all granted
</Location>
В Apache 2.4 вы можете добавить оператор Require expr
в первый блок местоположения и оценить URI запроса, например:
Require expr %{REQUEST_URI} =~ m#^/.well-known/acme-challenge/.*#
или что-то в этой строке ( синтаксис фактически не тестировался). Странный синтаксис m #
- это альтернативная форма для регулярных выражений, позволяющая использовать /
в строке.
expr
docs: https://httpd.apache.org/docs/2.4/expr.html