nginx PHP 文件下载而不是执行

nginx PHP 文件下载而不是执行

我正在尝试实现以下目标。我的主网站位于域根目录下。它运行良好。即执行 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

免责声明:我不是专业人士,因此如果您发现错误,请好心地告诉我,我希望能够更新。

相关内容