如何在 nginx vhost 中添加 open_basedir 路径

如何在 nginx vhost 中添加 open_basedir 路径

在 php.ini 中我设置了

open_basedir = /home/user/web/

现在我想在子域上运行 phppgadmin,该子域需要包含来自 /usr/share/phppgadmin 的文件。
因此,我在此主机的 nginx-config 中添加了以下行:

fastcgi_param PHP_VALUE open_basedir="/home/user/web/:/usr/share/phppgadmin/";

并重新启动了 nginx。但是,由于以下错误,我无法访问该网站:

[错误] 31440#0:*1 FastCGI 在 stderr 中发送:“PHP 警告:include_once():open_basedir 限制生效。文件(/usr/share/phppgadmin/libraries/lib.inc.php)不在允许的路径内:(/主页/用户/网站/)在 /usr/share/phppgadmin/info.php 第 10 行

这里没有列出第二条路径的原因可能是什么?我还需要什么才能将 open_basedir 添加到虚拟主机?我只使用了 /sites-available 中的默认文件。

编辑总是想着重启fpm......

service php5-fpm restart

答案1

对于您的特殊情况,您应该考虑只添加/usr/share到默认值open_basedir,因为其中的任何内容都是为了让世界阅读而设计的。

另外,open_basedir除非您锁定了shell_exec、和类似的 PHP 函数exec,否则很容易被规避system,所以不要考虑使用它是否安全(我知道,这很糟糕)。

如果您想知道如何轻松规避它,您只需 即可system('php -n ascript.php');。这-n将导致不读取 PHP.ini,因此open_basedir不会应用任何内容。

答案2

仅供参考,如果您为多个 vhosts 设置了 nginx 配置(因此,配置在/etc/nginx/sites-enabled/example.com),那么您可能需要在那里设置fastcgi_param PHP_VALUE open_basedir=

    location ~ \.php$ {
            try_files $uri =404;
            fastcgi_param PHP_VALUE open_basedir="/var/www/:/new/path";
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
            fastcgi_index index.php;
            include fastcgi_params;

答案3

open_basedir通过配置fastcgi_param可能会导致一些问题当您的服务器上有多个站点时。

另一个选择是使用用户配置文件

相关内容