Как использовать FastCGI глобально и Basic Auth в подразделах в nginx?
Я недавно развернул свою первую установку nginx, и все работает очень хорошо, за исключением того, что разбор местоположения сводит меня с ума. У меня есть простая настройка php fastcgi, как это:
location ~ \.php {
if (!-e $request_filename) {
return 404;
}
include /etc/nginx/fastcgi.conf;
keepalive_timeout 0;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
}
Теперь я хочу обеспечить некоторые местоположения с базовой аутентификацией, как это:
location /madmin {
auth_basic "Restricted";
auth_basic_user_file /var/www/localhost/admincp/.htpasswd;
}
С его настройкой nginx запрашивает пароль при переходе к /madmin, но не спрашивает по адресу /madmin/foo.php. Если я изменю местоположение аутентификации на что-то вроде "location ~ ^/madmin", то nginx подарит php-файл для скачивания...
не возможно ли настроить несколько мест в nginx? если нет, какой здесь обходной путь?
Спасибо за вашу помощь.
3 ответа
Пожалуйста, смотрите http://nginx.org/en/docs/http/request_processing.html для описания того, как nginx обрабатывает запрос, включая местоположения. В вики документации также есть несколько хороших примеров. К сожалению, в настоящее время недокументированная функция - это то, что вам нужно, скорее всего.
Как упоминалось ранее, в NginX выигрывает только одна локация; однако, вы можете не знать, что nginx поддерживает местоположения внутри локаций. Таким образом, ваша стратегия определения местоположения может быть похожа на пример сервера (fastcgi.conf в 0.8.31+):
upstream my-backend {
localhost:9000;
}
server {
listen 80;
server_name my-awesome-php.site;
root /path/to/root;
# The protected location
location /protected {
auth_basic "Give me codes.";
auth_basic_user_file /path/to/.htpasswd;
location ~ \.php$ {
include fastcgi.conf;
fastcgi_pass my-backend;
}
}
# Normal files (blank location is OK, just means serve from root)
location / {
}
# PHP for normal stuff
location ~ \.php$ {
include fastcgi.conf;
fastcgi_pass my-backend;
}
}
Это, похоже, решает проблему, но выглядит ужасно с большим количеством директив размещения, и я думаю, что даже статические файлы теперь обслуживаются php-fastcgi, но это может быть решено переписыванием директивы if, я думаю.
location ~ ^/madmin {
auth_basic "Restricted Access";
auth_basic_user_file /var/www/localhost/admincp/.htpasswd;
include /etc/nginx/fastcgi.conf;
fastcgi_pass 127.0.0.1:9000;
}
Причина этого в том, что nginx выберет наиболее конкретный доступный блок местоположения. Местоположение, совпадающее с регулярным выражением, победит чистое совпадение строк.
Поэтому, когда у вас есть запрос на / madmin, он совпадает с вашим местоположением авторизации, но все, что заканчивается на.php, пойдет в первую очередь.
Причина, по которой ~^ /madmin обслуживает php-код без разбора, заключается в том, что ~ ^ останавливает поиск, если соответствует следующее регулярное выражение.
Вы можете увидеть документацию по местоположению здесь: http://wiki.nginx.org/NginxHttpCoreModule