使用 PHP-FPM 在子目录中实现 Nginx 维护模式 (503)

使用 PHP-FPM 在子目录中实现 Nginx 维护模式 (503)

我正在使用带有 PHP-FPM 的 Nginx,并且我想限制对我网站上 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;
}

答案1

我已经搞清楚了。显然,真正阻止 PHP 文件被 PHP-FPM 处理的唯一方法是使用 HttpAccessModule 的“全部拒绝”,而不能只是“返回 503”。

以下是一个 Nginx 配置片段,它定义了一个自定义 503 错误页面,并允许您阻止对子目录的所有公共访问,包括 PHP-FPM 生成的 PHP 文件。您可以使用以下规则定义哪些 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;
}

答案2

nginx 仅限进程 location,因此您需要添加限制每一个 location您想要限制的。对于您的情况,您必须创建第二个location来处理子目录中的 PHP 文件,与第一个类似,但增加了限制。

相关内容