nginx: Não permitir acesso a uma pasta, exceto algumas subpastas

2

Como é possível negar acesso a uma pasta, mas exceto algumas subpastas nela de "negar"?

Eu tentei algo assim (nesta ordem):

#esta subpasta não deve ser negada e scripts dentro do PHP devem ser executáveis

localização ~ / data / public { permitir todos; }

#esta pasta contém muitas subpastas que devem ser negadas do acesso público

localização ~ / data { negar tudo; return 404; }

... que não funciona corretamente. Os arquivos dentro da pasta / data / public são acessíveis (todos os outros em / data são negados como deveriam), mas os arquivos PHP não são mais executados na pasta / data / public (se eu não adicionar essas restrições, o PHP arquivos são executáveis).

O que está errado? Como isso pode ser correto? Eu acho que há uma maneira melhor de fazer isso.

Seria muito bom se alguém pudesse me ajudar com isso:).

Obrigado, mas os arquivos PHP ainda não são executados na pasta / data / public /, como um simples

<? echo "test"; ?>

Ele fornece esse arquivo como um download (sem a configuração "negar" acima, os arquivos php estão funcionando bem).

Minha configuração do PHP:

location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}

Arquivos PHP em todos os outros diretórios fora do / data / estão funcionando ... (outras subpastas também).

    
por carrot 19.11.2012 / 16:33

2 respostas

5

Os motivos pelos quais os arquivos php não estão sendo processados é que, quando atinge o local /data/public/ , ele para e não sabe como processar arquivos php.

Tente colocar seu local do php em outro arquivo chamado php.conf e inclua esse arquivo no bloco do servidor e no bloco /data/public/ . Então sua configuração será parecida com

server {
    location ^~ /data/public/ {
        allow all;
        try_files $uri $uri/ /index.php?args;
        # include to avoid writing it twice..
        include php.conf
    }

    location ^~ /data/ { 
        deny all; 
    }

    # .....
    # Some other config blocks
    # .....

    # Put this line instead of the php config block to avoid writing the php part twice
    include php.conf
}

e o arquivo php.conf será exibido (no seu caso) assim:

location ~ \.php$ {
     fastcgi_split_path_info ^(.+\.php)(/.+)$;
     fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
     fastcgi_index index.php;
     include fastcgi_params;
}
    
por 20.11.2012 / 09:01
0

A regra de localização deve ter esta aparência.

location ^~ /data/                { deny all; }

ou

location ^~ /data/public/               { allow all; }

As regras de localização do nginx são as seguintes

To find a location matching a given request, nginx first checks locations defined using the prefix strings (prefix locations). Among them, the most specific one is searched. Then regular expressions are checked, in the order of their appearance in a configuration file. A search of regular expressions terminates on the first match, and the corresponding configuration is used. If no match with a regular expression is found then a configuration of the most specific prefix location is used.

As regras de acesso do nginx são as seguintes

"Access rules are checked according to the order of their declaration. The first rule that matches a particular address or set of addresses is the one that is obeyed."

para que uma configuração funcional seja parecida com

location ^~ /data/public/               { allow all; }
location ^~ /data/ { deny all; }

Ao usar deny all, ele deve retornar 403 Forbidden ao invés de 404.

Isso deve permitir que o diretório público seja acessado e processado e qualquer outra coisa bloqueada. Eu tive esse mesmo problema quando estava trabalhando na minha configuração nginx para o Magento, mas percebi pelo truque.

    
por 19.11.2012 / 21:02