В предыдущий вопрос, Я пытался защитить паролем папку / 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 по-прежнему загружались?
Проблема заключается в фундаментальном недоразумении относительно как 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$
блок.
Других решений пока нет …