Nginx разрешает / запрещает игнорирование директив, все равно обрабатывается php
У меня есть каталог (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;
}
}
}
1 ответ
Как 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-скриптах.
РЕДАКТИРОВАТЬ: Обновлено в соответствии с комментарием Алексея.