nginx: auth_basic и php - PullRequest
       3

nginx: auth_basic и php

9 голосов
/ 15 января 2011

Я хочу защитить папку моего сайта паролем, используя auth_basic.Эта папка содержит php-скрипты, которые должны быть выполнены, если они запрашиваются.

Я попробовал следующее:

location /admin {
  auth_basic    "Admin-Section";
  auth_basic_user_file /myfolder/.htpasswd;
 }

 location ~ ^/admin/.*\.php$ {
  auth_basic    "Admin-Section";
  auth_basic_user_file /myfolder/.htpasswd;
  fastcgi_pass 127.0.0.1:9000;
  fastcgi_index index.php;
  fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
  include   fastcgi_params;
 }

При запросе php-скриптов у меня спросят имя пользователя / парольэту папку администратора, но php-скрипты всегда будут загружаться вместо выполнения через fastcgi.

Что я делаю не так?

РЕДАКТИРОВАТЬ: На моей локальной машине все работает нормально с этой конфигурацией,о0РЕДАКТИРОВАТЬ: Кстати, php работает вне папки администратора с теми же параметрами fastcgi.РЕДАКТИРОВАТЬ: OMG!Конфигурация сайта была сохранена в / etc / nginx / sites-available / mysite и / etc / nginx / sites-enabled / содержала символическую ссылку на файл mysite.С тех пор изменение mysite-файла не дало никаких результатов.Например, изменение всех мест на «запретить все» не имело никакого эффекта.Файлы были отправлены без проблем.Поэтому я удалил символическую ссылку и перезапустил сервер.Затем я снова создал символическую ссылку, перезапустил сервер и все работает как положено.Может кто-нибудь объяснить странное поведение?

С наилучшими пожеланиями,Biggie

Ответы [ 4 ]

12 голосов
/ 23 июня 2012

При такой конфигурации nginx будет соответствовать только одному из двух блоков - одному с наивысшим приоритетом.

Решение состоит в том, чтобы объединить PHP-блок в * 1006.* блок AUTH.Такой подход рекомендовал сам автор nginx Игорь Сысоев.

location /admin/ {
  auth_basic    "Admin-Section";
  auth_basic_user_file /myfolder/.htpasswd;
  location ~ \.php$ {
   fastcgi_pass  127.0.0.1:9000;
   fastcgi_index index.php;
   fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
   include       fastcgi_params;
  }
}

location ~ \.php$ {
  fastcgi_pass  127.0.0.1:9000;
  fastcgi_index index.php;
  fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
  include       fastcgi_params;
}
1 голос
/ 02 июня 2012

Это старый вопрос, но у меня была та же самая проблема, поэтому вот объяснение.

Nginx использует правила, описанные в документах , чтобы соответствовать блокам расположения.Для обычных блоков самое длинное соответствие будет тем, которое будет применено, но для регулярных выражений это будет всегда первый соответствующий блок , который будет применен.

На вашем производственном сервере вы наиболеескорее всего, у вас был блок location ~ \.php$ над вашим административным блоком, поэтому опубликованный вами блок прослушивания никогда не применялся.

Длинный рассказ: при работе с блоками прослушивания регулярного выражения в nginx порядок имеет значение.Поместите более конкретные совпадения перед общими.

0 голосов
/ 14 июля 2015

Возможно вы забыли добавить root:

location ~ .\php$ {
    #Lines of code...
    root /your/document/root;
    #Lines of code...
}

location /admin/ {
    #Lines of code...
    root /your/document/root;
    #Lines of code...
}
0 голосов
/ 02 августа 2011

Вам необходимо удалить следующую строку:

fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...