Назад | Перейти на главную страницу

Как использовать 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 нельзя настроить несколько локаций? Если нет, то какой здесь обходной путь?

Спасибо за вашу помощь.

Посмотри пожалуйста 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;
}