Как использовать 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

Другие вопросы по тегам