Nginx permite / nega diretivas sendo ignoradas, php sendo processado de qualquer maneira

1

Eu tenho um diretório (www / nginx / website1 / private) que eu não quero que seja acessível pelo navegador, mas que deve ser acessível pelos aplicativos php com base no conteúdo do diretório.

Eu tentei tudo o que posso pensar e li perguntas semelhantes aqui; nada que eu tentei funcionou.

Eu tentei:

location /private/ {
allow 127.0.0.1;
deny all;
return 404; # do not want to acknowledge existence of files. return 404
}

Não funciona. Se eu navegar diretamente para o arquivo php, ele irá processar o arquivo php - o que eu confirmei adicionando um comando echo ao arquivo php.

Este é o meu arquivo nginx.conf atual (sem nenhuma das minhas tentativas com falha). O que eu preciso adicionar (e onde) para bloquear o acesso da maneira que descrevi acima?

Muito obrigado!

user www;
worker_processes  4;
error_log /var/log/nginx/error.log info;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
     # Set size for max uploaded content
        client_max_body_size 0; #max size disabled
        client_header_timeout 30m;
        client_body_timeout 30m;
        access_log /var/log/nginx/access.log;
        ## Block spammers ##
        include blockips.conf;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name REDACTED;
        root /usr/local/www/nginx;
        index index.php index.html index.htm;

         listen              443 ssl;
         server_name    REDACTED
    ssl_certificate     REDACTED;
    ssl_certificate_key  REDACTED;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;

### case insensitive http user agent blocking  ###
if ($http_user_agent ~*
(Googlebot|AdsBot-Google|Googlebot-images|msnbot|Bingbot|AltaVista|archive|archive.is|Slurp)
) {
    return 403;
}

## Only allow these request methods ##
     if ($request_method !~ ^(GET|HEAD|POST)$ ) {
         return 444;
     }
## Do not accept DELETE, SEARCH and other methods ##

        location / {
            try_files $uri $uri/ =404;
        }

        error_page      500 502 503 504  /50x.html;
        location = /50x.html {
            root /usr/local/www/nginx-dist;
        }

        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $request_filename;
                include fastcgi_params;
        }
    }
}
    
por hegemon 15.04.2017 / 03:12

1 resposta

1

Como location directive documentação diz, expressões regulares são correspondidas depois que as correspondências de prefixo tiverem sido tentadas e as correspondências de expressões regulares vencerem nesse caso.

Para evitar esse comportamento, é necessário usar o modificador ^~ no bloco location .

Assim, sua regra de bloqueio deve ficar assim:

location ^~ /private/ {
    allow 127.0.0.1;
    deny all;
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        include fastcgi_params;
    }
}

Também precisamos duplicar o bloco de processamento do PHP aqui, porque o modificador ^~ impede que o bloco principal do PHP seja usado.

Não é possível usar return aqui, deny sempre retornará o código de erro 403.

Se você quiser outro código de erro, eu acho que sua única opção é implementar o controle de acesso em seus scripts PHP.

EDIT: Atualizado de acordo com o comentário de Alexey.

    
por 15.04.2017 / 05:07