nginx local aninhado com regex

1

Estou tentando aplicar a autenticação HTTP à maioria do meu site, com exceção da página inicial, do caminho /welcome e separar / admin /, / services / e / stats / sections.

Eu não pareço estar fazendo isso corretamente; aqui está minha configuração atual:

location ~ ^/(admin|services|stats)/ {   # L1
    # don't need http auth at this path as there is separate auth
    proxy_pass          http://myapp-admin-cluster;
    proxy_redirect      off;
    proxy_set_header    Host $host;
    proxy_set_header    X-Real-IP $remote_addr;
    proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header    X-Forwarded-Host $server_name;
}

location / {  #L2
    location ~ /(?!welcome).+ {   #L3
        auth_basic "MyApp";
        auth_basic_user_file /var/www/myapp/htpasswd;
    }
    proxy_pass          http://myapp-web-cluster;
    proxy_redirect      off;
    proxy_set_header    Host $host;
    proxy_set_header    X-Real-IP $remote_addr;
    proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header    X-Forwarded-Host $server_name;
}

O problema é que se eu navegar para /admin/ recebo HTTP 404, em vez de minha solicitação ser encaminhada para o proxy myapp-admin-cluster (e também não é encaminhada para o proxy myapp-web-cluster) .

Q1: Por que as configurações de proxy definidas no corpo L2 não são aplicadas aos caminhos correspondentes a L3?

Q2: Por que o local aninhado L3 substitui L1? Eles são ambos os jogos de regex, então com certeza devem coincidir com o primeiro? Citação de nginx doc: "Então, as expressões regulares são verificadas, na ordem em que aparecem no arquivo de configuração. A pesquisa de expressões regulares termina na primeira correspondência"

    
por EoghanM 11.08.2016 / 16:48

1 resposta

1

Como basicamente a localização / corresponderá a qualquer padrão de URL, assim, quando você não puder corresponder à sequência de caracteres do administrador, você corresponderá à regra no bloco /.

A partir de sua regra L3, você corresponde todas as páginas, exceto a correspondência / welcome , para que você seja redirecionado para executar a autenticação básica.

UPDATE:
Como o autor atualizou sua pergunta, o bloco de localização deve ser atualizado e eu também suspeito que o Nginx não pode encontrar qual arquivo deve ser exibido ao fazer o redirecionamento, sugiro colocar uma seção de índice também:

location ~* ^/(admin|services|stats)/ {
    index index.html;
    ...

Como você está criando um proxy com o URL, é necessário ter o arquivo correspondente no link

Por exemplo, temos o seguinte URL:

http://<your_webserver_IP or DNS>/admin/1.html

Você será redirecionado para:

http://myapp-admin-cluster/admin/1.html

Mas não:

http://myapp-admin-cluster/

Espero que você tenha algumas dicas para resolver seu problema.

    
por 11.08.2016 / 18:22

Tags