У меня есть каталог (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;
}
}
}
Так как 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.
РЕДАКТИРОВАТЬ: Обновлено в соответствии с комментарием Алексея.