Загрузка PHP-файлов nginx вместо выполнения

Я пытаюсь добиться следующего. У меня есть основной сайт в корневом каталоге домена. Работает нормально. т.е. файлы PHP выполняются. Через некоторое время я добавил каталог "auth" с базовой HTTP-аутентификацией. Затем я загрузил программу PHP в каталог "auth", но файлы PHP загружаются, а не выполняются.

  • domain.name/test.php -> выполнение
  • domain.name/sub/file.php -> выполнение
  • domain.name/auth/protected.php -> загрузка вместо выполнения

Вот сайты-доступные конф

сервер {
    кодировка utf-8;

    слушай 80 default_server;
    слушай [::]: 80 default_server;

    root / var / www / html;

    # Добавьте index.php в список, если вы используете PHP
    index index.php index.html index.htm index.nginx-debian.html;
    имя_сервера xxx.com;

    место нахождения / {
        # Сначала попытайтесь обработать запрос как файл, затем
        # в качестве каталога, затем перейдите к отображению 404.
        # try_files $uri $uri/ =404;
        try_files $uri $uri/ /index.php?$args;
    }

    местоположение ^~ /auth {
        auth_basic "Запрещенный контент";
        auth_basic_user_file /var/www/html/auth/.htpasswd;
    }

    местоположение ^ ~ / защищенный {
        отрицать все;
    }

    location ~ \.php $ {
        include snippets / fastcgi-php.conf;

        # С php5-fpm:
        fastcgi_pass unix: /var/run/php5-fpm.sock;
    }

    location ~ /\.(ht|git|svn) {
        отрицать все;
    }
}

В настоящее время у меня есть следующее решение, но я считаю, что это не правильный путь.

    местоположение ^~ /auth {
        auth_basic "Запрещенный контент";
        auth_basic_user_file /var/www/html/auth/.htpasswd;
        location ~ \.php $ {
            include snippets / fastcgi-php.conf;

            # С php5-fpm:
            fastcgi_pass unix:/var/run/php5-fpm.sock;
        }
    }

Следующее решение не работает

        местоположение ^ ~ / auth {
                auth_basic "Запрещенный контент";
                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;
        }

1 ответ

Была такая же проблема!

Нашел ответ здесь, 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;

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

Если бы мы хотели следовать принципу СУХОЙ ("Не повторяй себя"), мы бы объявили PHP-fpm и FastCGI в глобальных настройках. Мы можем сделать это, переместив его ниже (например, но это просто должно быть за пределами директивы location). Вот пример.

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

Отказ от ответственности: я не профессионал, поэтому, если вы видите ошибки, будьте добры и просто дайте мне знать, и я надеюсь, что обновлю.

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