Apache - Permitir acesso ao diretório globalmente com alias sem autenticação

3

Eu tenho um virtualhost, que tem algumas restrições de acesso configuradas assim:

<Location "/">
    AuthType Basic
    AuthName "Restricted Content"
    AuthUserFile /var/www/domain/htdocs/.htpasswd
    Require valid-user
</Location>

Além disso, tenho o seguinte conf -file:

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>

Eu preciso que /.well-known/acme-challenge/ seja acessível sem autenticação.

Já tentei adicionar diferentes variações de Require all granted ao meu conf -file, mas sem sucesso.

Como posso tornar o /.well-known/acme-challenge/ acessível sem autenticação para todos os virtualhosts? (Eu não quero modificar nenhum virtualhosts, este virtualhost é apenas um exemplo).

    
por Zulakis 18.12.2016 / 21:29

2 respostas

3

Não há possibilidade de sobrescrever a instrução <Location /> do seu contexto virtualhost no contexto do servidor. De documento do apache :

Sections inside <VirtualHost> sections are applied after the corresponding sections outside the virtual host definition. This allows virtual hosts to override the main server configuration.

A ordem de mesclagem é (o último grupo mesclado ganha):

  1. <Directory> (exceto expressões regulares) e .htaccess feitos simultaneamente (com .htaccess, se permitido, sobrescrevendo <Directory> )
  2. <DirectoryMatch> (e <Directory "~"> )
  3. <Files> e <FilesMatch> feitos simultaneamente
  4. <Location> e <LocationMatch> feitos simultaneamente
  5. <If>

Além de <Directory> , cada grupo é processado na ordem em que aparecem nos arquivos de configuração.

<VirtualHost> não é permitido dentro de <If> , então <Location> é a última mesclada.

Mas

Se você veicular o site somente em um vhost https (o que seria razoável, por causa da autenticação), poderá fazer o seguinte (sem afetar seu vhost 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>
    
por 21.12.2016 / 19:30
0

No Apache 2.4, você pode adicionar uma instrução Require expr ao primeiro bloco de localização e avaliar o URI da solicitação, assim:

Require expr %{REQUEST_URI} =~ m#^/.well-known/acme-challenge/.*#

ou algo nessa linha (a sintaxe não foi testada). A estranha sintaxe m# é uma forma alternativa de expressões regulares poderem usar / na cadeia.

expr docs: link

    
por 18.12.2016 / 21:41