Назад | Перейти на главную страницу

Apache - разрешить доступ к каталогу с глобальным псевдонимом без аутентификации

У меня есть виртуальный хост, для которого настроены некоторые ограничения доступа следующим образом:

<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> разделы применяются после соответствующих разделов вне определения виртуального хоста. Это позволяет виртуальным хостам переопределять конфигурацию основного сервера.

Порядок объединения (побеждает последняя объединенная группа):

  1. <Directory> (кроме регулярных выражений) и .htaccess выполняются одновременно (с .htaccess, если разрешено, переопределение <Directory>)
  2. <DirectoryMatch><Directory "~">)
  3. <Files> и <FilesMatch> сделано одновременно
  4. <Location> и <LocationMatch> сделано одновременно
  5. <If>

Помимо <Directory>, каждая группа обрабатывается в том порядке, в котором они указаны в файлах конфигурации.

<VirtualHost> не допускается внутрь <If> так <Location> последнее слияние.

Но

Если вы обслуживаете сайт только на виртуальном хосте https (что было бы разумно из-за аутентификации), вы можете сделать следующее (не затрагивая виртуальный хост https):

Apache v2.2

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

Apache v2.4

<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