Existe uma maneira limpa de combinar as regras de localização do nginx?

2

Suponha que no meu servidor nginx eu queira realizar estes dois requisitos:

1) todos os arquivos *.php devem ser passados para o interpretador php

2) o diretório /private/ exigirá autenticação http

Se eu escrever

location /private/  {
  auth_basic            "Restricted";
  ....
}

location ~ \.php$ {
    fastcgi_pass   127.0.0.1:9000;
     .... more settings
}

então (se não me engano) a autenticação só será aplicada a arquivos não php. Se, em vez disso, eu adicionar o sinalizador ^~ ao bloco location , perderei o local do php. Isso é lógico, porque o nginx corresponde apenas a um bloco de localização. Parece que a única opção que resta é usar um local aninhado:

location /private/  {
  auth_basic            "Restricted";
  ....
    location ~ \.php$ {
       fastcgi_pass   127.0.0.1:9000;
         .... more settings
    }
}

location ~ \.php$ {
    fastcgi_pass   127.0.0.1:9000;
     .... more settings
}

Eu não gosto muito disso, porque ele parece pouco elegante e frágil para mim: cada vez que eu adiciono um diretório protegido (ou algum diretório com alguma configuração especial), devo lembrar de adicionar locais aninhados para PHP (e talvez outros tipos de arquivos). Mas parece ser o único caminho a percorrer. Isso é assim? Alguém pode sugerir uma solução melhor?

    
por leonbloy 22.06.2014 / 05:12

1 resposta

3

Infelizmente, não. Não há uma maneira mais limpa, como explicado aqui , aqui e no documentação

Mas, você provavelmente deveria usar um arquivo separado para sua configuração do php, assim, tudo que você precisa fazer é isto:

location /private/  {
    auth_basic            "Restricted";
    ....
    location ~ \.php$ {
        include phpconf.conf;
    }
}

location ~ \.php$ {
   include phpconf.conf;
}
    
por 22.06.2014 / 22:19

Tags