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.