Nginx разрешает / запрещает игнорирование директив, все равно обрабатывается php

У меня есть каталог (www/nginx/website1/private), который я не хочу, чтобы он был доступен через веб-браузер, но который должен быть доступен приложениям php, использующим содержимое этого каталога.

Я перепробовал все, что мог придумать, и прочитал похожие вопросы здесь; ничто из того, что я пробовал, не сработало.

Я пытался:

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

Не работает Если я перейду непосредственно к файлу php, он обработает файл php, что я подтвердил, добавив команду echo в файл php.

Это мой текущий файл nginx.conf (без каких-либо неудачных попыток). Что мне нужно добавить (и где), чтобы заблокировать доступ, как я описал выше?

Большое спасибо!

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;
        }
    }
}

1 ответ

Решение

Как location Директивная документация говорит, что регулярные выражения сопоставляются после того, как совпадения префиксов были выполнены, и совпадения регулярных выражений выигрывают в этом случае.

Чтобы предотвратить это, нужно использовать ^~ модификатор в location блок.

Итак, ваше правило блокировки должно выглядеть так:

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;
    }
}

Нам также нужно продублировать блок обработки PHP здесь, потому что ^~ Модификатор предотвращает использование основного блока PHP.

Нельзя использовать return Вот, deny всегда будет возвращать 403 код ошибки.

Если вам нужен еще один код ошибки, я полагаю, что единственный вариант - реализовать контроль доступа в ваших PHP-скриптах.

РЕДАКТИРОВАТЬ: Обновлено в соответствии с комментарием Алексея.

Другие вопросы по тегам