Nginx успешно защищает файлы PHP паролем, но затем предлагает вам загрузить их

В предыдущий вопрос, Я пытался защитить паролем папку / admin / и подпапки, используя Nginx с .htpasswd и regex.

Это было сделано успешно, но теперь, после аутентификации по паролю, Nginx предлагает «скачать» php-файлы, а не просто загружать их.

Этого не происходит, когда новый блок аутентификации местоположения закомментирован. Например, в этом примере кода страницы PHP загружаются без проблем:

    location / {
try_files $uri $uri/ =404;
}

#location "~^/admin/.*$" {
#       try_files $uri $uri/ =404;
#       auth_basic "Restricted";
#       auth_basic_user_file /etc/nginx/.htpasswd;
#}

location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

Как я могу разрешить эти (явно конфликтующие) блоки местоположения, чтобы раздел / admin / был защищен паролем, а файлы php по-прежнему загружались?

2

Решение

Проблема заключается в фундаментальном недоразумении относительно как nginx обрабатывает запрос. В принципе, nginx выбирает одно место для обработки запроса.

Ты хочешь nginx обрабатывать URI, которые начинаются с /admin в блоке местоположения, который требует auth_basic, Кроме того, URI, которые заканчиваются на .php нужно отправить на PHP7.

Таким образом, вам нужно два блока fastcgi, один для обработки обычных PHP-файлов и один для обработки ограниченных PHP-файлов.

Есть несколько форм location директива. Вы уже обнаружили, что расположение регулярных выражений упорядочено и, следовательно, ваши location "~^/admin/.*$" блок эффективно предотвращает location ~ \.php$ заблокировать просмотр любого URI, начинающегося с /admin и заканчивая .php,

Чистым решением было бы использовать вложенные блоки местоположения и использовать ^~ модификатор, который заставляет местоположение префикса иметь приоритет над местоположением регулярного выражения:

location / {
try_files $uri $uri/ =404;
}

location ~ \.php$ {
try_files $uri =404;

include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
}

location ^~ /admin/ {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;

try_files $uri $uri/ =404;

location ~ \.php$ {
try_files $uri =404;

include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
}
}

Обратите внимание, что location ^~ является префиксом местоположения, а не местоположением регулярного выражения.

Обратите внимание также, что fastcgi_split_path_info а также fastcgi_index директивы не требуются в location ~ \.php$ блок.

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector