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>

I необходимо, чтобы /. well-known / acme-challenge / был доступен без аутентификации.

Я уже пробовал добавлять различные варианты Требовать все предоставленные в мой conf -файл, но безрезультатно.

Как сделать /. Well-known / acme-challenge / доступным без аутентификации для всех виртуальных хостов? (Я не хочу изменять какие-либо виртуальные хосты, этот виртуальный хост является всего лишь примером).

3
задан 19 December 2016 в 15:15
2 ответа

Невозможно переопределить оператор из вашего контекста виртуального хоста в контексте сервера. Из apache doc :

Разделы внутри разделов применяются после соответствующие разделы вне определения виртуального хоста. Этот позволяет виртуальным хостам переопределять конфигурацию основного сервера.

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

  1. (кроме регулярных выражений) и .htaccess выполняется одновременно (с .htaccess, если разрешено, переопределение )
  2. )
  3. и выполняется одновременно
  4. и выполняется одновременно

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

не допускается внутри , поэтому является последним объединено.

Но

Если вы обслуживаете сайт только на виртуальном хосте 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.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>

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>
3
ответ дан 3 December 2019 в 06:28

В 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

0
ответ дан 3 December 2019 в 06:28

Теги

Похожие вопросы