apache locationmatch negative regex

4

Estou tentando expor um local por meio do Apache. Normalmente, eu tenho esse bloco no meu vhost que diz

<Location />
    AuthType Basic
    AuthUserFile /web/.htpasswd
    AuthName "Test Site"
    Require valid-user
</Location>

Isso funciona bem - tudo que é exibido requer um usuário válido. Agora quero expor um serviço que não requer autenticação, por isso estou procurando uma maneira de fazer com que todos os locais, exceto os / serviços, exijam autenticação. Eu tenho jogado com LocationMatch, mas não estou totalmente claro sobre o que está fazendo.

<LocationMatch ^/(?!services)[^.]*$>
AuthType Basic
...
</LocationMatch>

Permite / serviços e tudo abaixo dele ignorar o LocationMatch, mas tem o efeito colateral de permitir example.com/.somefile para ignorar o bloco LocationMatch.

Além disso, quando tentei

<LocationMatch ^/(?!services)>
AuthType Basic
...
</LocationMatch>

tudo (incluindo / serviços) é correspondido pelo LocationMatch.

Eu apreciaria se alguém pudesse me dizer o que a classe [^.] faz que o segundo teste não faz e como expor somente / serviços enquanto mantém todos os outros caminhos sob autenticação.

    
por Jeff 21.08.2011 / 08:20

5 respostas

1

Bem, [^.] significa "não é um . ", e é por isso que /.somefile não corresponde. Uma possível razão pela qual o seu último exemplo não funciona é porque as expressões regulares compatíveis com Perl são suportadas apenas a partir do Apache 2.0, então se você estiver no Apache 1.3 (você deve especificar uma versão do Apache na sua pergunta), seja isso.

    
por 21.08.2011 / 08:24
1

Esta página de Antonio Lorusso sugere o seguinte para excluir pastas da autenticação do apache:

<Location "/">
AuthType Basic
AuthName "Restricted Files"
AuthUserFile /var/www/clients/client12/web17/passwd
AuthGroupFile /dev/null
Require valid-user
SetEnvIf Request_URI "^/(admin|skin|js|index)(.*)$" allow
SetEnvIf Request_URI "^/favicon.ico$" allow
Order allow,deny
Allow from env=allow
Satisfy Any
</Location>

Nesse caso, os URLs que começam com / admin, / skin, / js ou / index serão ignorados pela autenticação.

A parte principal desta seção para você é:

SetEnvIf Request_URI "^/(admin|skin|js|index)(.*)$" allow

No seu caso, o código apropriado seria:

SetEnvIf Request_URI "^/services(.*)$" allow

_

    
por 25.08.2011 / 23:31
0

Mantém o

<Location />
  AuthType Basic 
  AuthUserFile /web/.htpasswd
  AuthName "Test Site"
  Require valid-user
</Location>

e adicione um novo local

<Location /services>
  Satisfy any
  Order deny,allow
</Location>
    
por 08.08.2014 / 17:24
0

Com o apache 2.4, você pode fazer algo assim:

<Location />
    <If "%{REQUEST_URI} =~ m#^/services/#">
        Satisfy any
        Order deny,allow
    </If>
    <Else>
        AuthType Basic
        AuthUserFile /web/.htpasswd
        AuthName "Test Site"
        Require valid-user
    </Else>
</Location>
    
por 19.04.2016 / 21:41
0

Tentei muitas maneiras sem sucesso.
E finalmente isso funciona no apache 2.2.

  • Dois caminhos não autorizados e outros caminhos sim
  • Adicionei a regravação de / para / ui para tornar possível

Hère é o uso da diretiva LocationMatch

  <LocationMatch /(firstpath|secondpath).*>
            AuthType Basic
            AuthName "Restricted AREA "
            AuthUserFile /etc/apache2/security/password
            AuthGroupFile /etc/apache2/security/group
            Require group admin
            Order allow,deny
            Allow from 127.0.0.1
            Allow from 10.0.0.0/24
            Allow from env=allowclient

            Satisfy any
    </LocationMatch>
    
por 11.04.2017 / 15:26