Я пытаюсь добиться следующего. У меня основной веб-сайт в корневом каталоге домена. Работает нормально. т.е. исполняются файлы PHP. Через некоторое время я добавил каталог auth с базовой HTTP-аутентификацией. Затем я загрузил программу PHP в каталог «auth», но файлы PHP загружаются, а не выполняются.
Вот доступная с сайтов конф.
server { charset utf-8; listen 80 default_server; listen [::]:80 default_server; root /var/www/html; # Add index.php to the list if you are using PHP index index.php index.html index.htm index.nginx-debian.html; server_name xxx.com; location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. # try_files $uri $uri/ =404; try_files $uri $uri/ /index.php?$args; } location ^~ /auth { auth_basic "Restricted Content"; auth_basic_user_file /var/www/html/auth/.htpasswd; } location ^~ /protected { deny all; } location ~ \.php$ { include snippets/fastcgi-php.conf; # With php5-fpm: fastcgi_pass unix:/var/run/php5-fpm.sock; } location ~ /\.(ht|git|svn) { deny all; } }
В настоящее время у меня есть следующее решение, но я считаю, что это неправильный путь.
location ^~ /auth { auth_basic "Restricted Content"; auth_basic_user_file /var/www/html/auth/.htpasswd; location ~ \.php$ { include snippets/fastcgi-php.conf; # With php5-fpm: fastcgi_pass unix:/var/run/php5-fpm.sock; } }
Следующее решение не работает
location ^~ /auth { auth_basic "Restricted Content"; auth_basic_user_file /var/www/html/auth/.htpasswd; try_files $uri @php-fpm; } location @php-fpm { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php5-fpm.sock; }
Была такая же проблема!
Нашел ответ здесь, http://www.ceus-now.com/nginx-password-protect-directory-downloads-source-code/
Поскольку мы добавляем ^ ~, мы оставляем некоторые другие настройки (не знаю, почему нам нужно добавить это, но это был единственный способ заставить его фактически подтянуть аутентификацию :()
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/lib/php5-fpm/web11.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_intercept_errors on;
Я пробовал различные комбинации, чтобы увидеть, что было / не нужно, и каждая строка нужна. Хотел бы я лучше понимать эти вещи.
ОБНОВЛЕНИЕ: 27 июля 2016 г .:
Итак, я немного прочитал и наконец понял, почему у нас возникла эта проблема.
Короче говоря, когда мы устанавливаем FastCGI и php-fpm, он создает директиву в файлах сервера nginx (какой файл зависит от установки вашего сервера).
Так что в моем у меня есть следующее ...
location ~ \.php$ {
include snippets/fastcgi-php.conf;
#
# # With php7.0-cgi alone:
# fastcgi_pass 127.0.0.1:9000;
# # With php7.0-fpm:
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
Как вы заметите, эти директивы находятся в местоположении /, а не в глобальных настройках. Поскольку мы хотим защитить определенную папку, эти директивы не наследуются. Следовательно, нам нужно объявить это снова.
Если бы мы хотели следовать принципу DRY («Не повторяйся»), мы бы объявили PHP-fpm и FastCGI в глобальных настройках. Мы можем сделать это, переместив его ниже (пример, но он просто должен быть вне директивы местоположения). Вот пример.
root /var/www/html;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
Надеюсь это поможет. Я понял это, прочитав https://www.digitalocean.com/community/tutorials/understanding-and-implementing-fastcgi-proxying-in-nginx
Отказ от ответственности: я не профессионал, поэтому, если вы видите ошибки, просто дайте мне знать, и я надеюсь, что обновлю.