Назад | Перейти на главную страницу

Режим обслуживания Nginx (503) в подкаталоге с PHP-FPM

Я использую Nginx с PHP-FPM и хочу ограничить доступ к подкаталогу файлов PHP на моем сайте, чтобы разрешался только трафик с моего IP-адреса.

Вот что я пробовал, предполагая, что мой IP-адрес 1.1.1.1:

location ^~ /blocktest/
    {
            if ($remote_addr != "1.1.1.1")
            {
                    return 503;
            }
    }

Это блокирует публика, но сценарии PHP больше не выполняются для меня, и мне просто предлагается загрузить необработанный файл. Итак, я попытался включить свой файл конфигурации PHP в блок, например:

location ^~ /blocktest/
    {
            if ($remote_addr != "1.1.1.1")
            {
                    return 503;
            }

            include /usr/local/nginx/conf/php.conf;
    }

... но тогда публика снова сможет получить доступ к файлам PHP. Тьфу. Есть идеи, как я могу заставить это работать? Спасибо!

Для справки вот мой файл php.conf:

location ~ \.php$ {
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;

    fastcgi_connect_timeout 60;
    #fastcgi_send_timeout 180;
    #fastcgi_read_timeout 180;
    fastcgi_send_timeout 2000;
    fastcgi_read_timeout 2000;
    fastcgi_buffer_size 256k;
    fastcgi_buffers 4 256k;
    fastcgi_busy_buffers_size 256k;
    fastcgi_temp_file_write_size 256k;
    fastcgi_intercept_errors on;

    fastcgi_param  PATH_INFO          $fastcgi_path_info;
    fastcgi_param  PATH_TRANSLATED    $document_root$fastcgi_path_info;

    fastcgi_param  QUERY_STRING   $query_string;
    fastcgi_param  REQUEST_METHOD     $request_method;
    fastcgi_param  CONTENT_TYPE   $content_type;
    fastcgi_param  CONTENT_LENGTH     $content_length;

    fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
    fastcgi_param  REQUEST_URI        $request_uri;
    fastcgi_param  DOCUMENT_URI   $document_uri;
    fastcgi_param  DOCUMENT_ROOT      $document_root;
    fastcgi_param  SERVER_PROTOCOL    $server_protocol;

    fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
    fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

    fastcgi_param  REMOTE_ADDR        $remote_addr;
    fastcgi_param  REMOTE_PORT        $remote_port;
    fastcgi_param  SERVER_ADDR        $server_addr;
    fastcgi_param  SERVER_PORT        $server_port;
    fastcgi_param  SERVER_NAME        $server_name;

    # PHP only, required if PHP was built with --enable-force-cgi-redirect
    fastcgi_param  REDIRECT_STATUS    200;
}

Я понял это. По-видимому, единственный способ фактически предотвратить обработку файлов PHP PHP-FPM - это использовать HttpAccessModule «deny all», вы не можете просто «вернуть 503».

Вот фрагмент конфигурации Nginx, который определяет настраиваемую страницу ошибки 503 и позволяет заблокировать весь открытый доступ к подкаталогу, включая файлы PHP, созданные PHP-FPM. Вы можете определить, какие IP-адреса имеют доступ к заблокированному подкаталогу, используя правила, определенные Документация Nginx HttpAccessModule.

# DEFINE CUSTOM 503 ERROR PAGE
error_page  503 /maintenance/503.htm;

location = /maintenance/503.htm
{
    internal;
}

# BLOCK A DIRECTORY
location ^~ /directory_to_block/
{
    error_page 403 =503 /maintenance/503.htm;

    allow 1.1.1.1; # your IP here
    deny all;

    include /usr/local/nginx/conf/php.conf;
}

только nginx обрабатывает один location, поэтому вам нужно добавить ограничение в каждый location что вы хотите ограничить. В вашем случае вам нужно будет создать второй location для обработки файлов PHP в подкаталоге аналогично первому с добавлением вашего ограничения.