我正在尝试实现以下目标。我的主网站位于域根目录下。它运行良好。即执行 PHP 文件。一段时间后,我添加了具有基本 HTTP 身份验证的“auth”目录。接下来,我将 PHP 程序上传到“auth”目录,但 PHP 文件正在下载而不是执行。
- domain.name/test.php -> 正在执行
- domain.name/sub/file.php -> 执行
- domain.name/auth/protected.php -> 下载而不是执行
这是可用的网站
服务器 { 字符集utf-8; 听 80 默认服务器; 听[::]:80默认服务器; 根目录/var/www/html; # 如果您使用 PHP,请将 index.php 添加到列表中 索引 index.php index.html index.htm index.nginx-debian.html; 服务器名称xxx.com; 地点 / { # 首先尝试以文件形式提供请求,然后 # 作为目录,然后回退到显示 404。 # 尝试文件 $uri $uri/ =404; try_files $uri $uri/ /index.php?$args; } 位置 ^~ /auth { auth_basic “受限内容”; auth_basic_user_文件/var/www/html/auth/.htpasswd; } 位置 ^~ /protected { 全部否认; } 位置 ~ \.php$ { 包括片段/fastcgi-php.conf; # 使用 php5-fpm: fastcgi_pass unix:/var/run/php5-fpm.sock; } 位置 ~ /\.(ht|git|svn) { 全部否认; } }
目前我已经找到了以下解决方案,但我认为这不是一个正确的方法。
位置 ^~ /auth { auth_basic “受限内容”; auth_basic_user_文件/var/www/html/auth/.htpasswd; 位置 ~ \.php$ { 包括片段/fastcgi-php.conf; # 使用 php5-fpm: fastcgi_pass unix:/var/run/php5-fpm.sock; } }
以下解决方案不起作用
位置 ^~ /auth { auth_basic “受限内容”; auth_basic_user_文件/var/www/html/auth/.htpasswd; try_files $uri@php-fpm; } 位置@php-fpm { 包括片段/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;
我尝试了各种组合来查看哪些是需要的,哪些不是,以及每行都是需要的。我希望我能更好地理解这些事情。
更新:2016 年 7 月 27 日:
所以我读了一些书,最终明白了为什么我们会有这个问题。
简而言之,当我们安装 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。我们可以将其移动到下面(示例,但它只需要在 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
免责声明:我不是专业人士,因此如果您发现错误,请好心地告诉我,我希望能够更新。