У меня есть виртуальный хост, для которого настроены некоторые ограничения доступа следующим образом:
<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>
я нуждаюсь /.well-known/acme-challenge/
быть доступным без авторизации.
Я уже пробовал добавлять разные варианты Require all granted
к моему conf
-файл, но безрезультатно.
Как я могу сделать /.well-known/acme-challenge/
доступен без аутентификации для всех виртуальных хостов? (Я не хочу изменять какие-либо виртуальные хосты, этот виртуальный хост является лишь примером).
Нет возможности отменить <Location />
из вашего контекста виртуального хоста в контексте сервера. Из документ apache:
Разделы внутри
<VirtualHost>
разделы применяются после соответствующих разделов вне определения виртуального хоста. Это позволяет виртуальным хостам переопределять конфигурацию основного сервера.
Порядок объединения (побеждает последняя объединенная группа):
<Directory>
(кроме регулярных выражений) и .htaccess выполняются одновременно (с .htaccess, если разрешено, переопределение <Directory>
)<DirectoryMatch>
(и <Directory "~">
)<Files>
и <FilesMatch>
сделано одновременно<Location>
и <LocationMatch>
сделано одновременно<If>
Помимо <Directory>
, каждая группа обрабатывается в том порядке, в котором они указаны в файлах конфигурации.
<VirtualHost>
не допускается внутрь <If>
так <Location>
последнее слияние.
Если вы обслуживаете сайт только на виртуальном хосте 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.conf
:
<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
документы: https://httpd.apache.org/docs/2.4/expr.html