Недавно я развернул свою первую установку 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 нельзя настроить несколько локаций? Если нет, то какой здесь обходной путь?
Спасибо за вашу помощь.
Посмотри пожалуйста 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;
}
}
Причина этого в том, что nginx выберет наиболее конкретный доступный блок местоположения. Местоположение, совпадающее с регулярным выражением, восторжествует над совпадением чистой строки.
Итак, когда у вас есть запрос на / madmin, он соответствует вашему местоположению авторизации, но все, что заканчивается на .php, сначала перейдет к нему.
Причина, по которой местоположение ~ ^ / madmin обслуживает php-код без синтаксического анализа, заключается в том, что ~ ^ останавливает поиск, если следующее регулярное выражение совпадает.
Вы можете увидеть документацию по местоположению здесь: http://wiki.nginx.org/NginxHttpCoreModule#location
похоже, это решает проблему, но это выглядит действительно ужасно с большим количеством директив местоположения, и я думаю, что даже статические файлы теперь обслуживаются 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;
}