我正在使用带有 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 文件,与第一个类似,但增加了限制。