Я использую 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 в подкаталоге аналогично первому с добавлением вашего ограничения.