如何在 nginx vhost 中添加 open_basedir 路径

32b*_*oat 6 php nginx fastcgi open-basedir

在 php.ini 我已经设置

open_basedir = /home/user/web/
Run Code Online (Sandbox Code Playgroud)

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

fastcgi_param PHP_VALUE open_basedir="/home/user/web/:/usr/share/phppgadmin/";
Run Code Online (Sandbox Code Playgroud)

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

[错误] 31440#0: *1 FastCGI 发送到 stderr: "PHP 警告: include_once(): open_basedir 限制生效。文件(/usr/share/phppgadmin/libraries/lib.inc.php) 不在允许的路径内(s): (/home/user/web/)在 /usr/share/phppgadmin/info.php 第 10 行

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

编辑总是想到重新启动fpm ...

service php5-fpm restart
Run Code Online (Sandbox Code Playgroud)

Jay*_*Jay 6

对于您的特定情况,您应该考虑仅添加/usr/share到 default open_basedir,因为其中的任何内容都旨在供全世界阅读。

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

如果您想知道如何轻松绕过它,您可以只需要system('php -n ascript.php');. 该-n不会造成任何php.ini中被读取,所以没有open_basedir将被应用。


小智 5

仅供参考,如果您为多个虚拟主机设置了 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;
Run Code Online (Sandbox Code Playgroud)