LNMP 环境下,ThinkPHP5 设置 public 为根目录网页显示空白解决办法
为了去掉TP5 URL地址里面的public,把网站根目录改成了 /home/wwwroot/www.csensix.com/public ,重启Nginx(lnmp nginx restart 或者 service nginx restart)发现网站打开空白,什么都不显示(谷歌浏览器提示500错误)。经过查找资料发现是lnmp一键环境包做了防跨站防护,导致不能访问public以外的目录。服务器环境 :centos6.8 64位,lnmp1.5 一键环境包(php多版本)
按lnmp集成环境提供的方法(lnmp vhost add)添加虚拟站点,访问 TP 站点就要加个二级目录,如
http://www.csensix.com/public
所以为了可以让访问链接变得更加友好(即http://www.csensix.com),可以修改/usr/local/nginx/conf/vhost/www.csensix.com.conf(下称“专属配置”)。
root /home/wwwroot/www.csensix.com;
改成
root /home/wwwroot/www.csensix.com/public;
那么问题来了,由于lnmp环境考虑到虚拟站点各自的访问目录权限问题,于是在 /usr/local/nginx/conf/fastcgi.conf
里配置了fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";
,那么每个站点的访问权限就限制在各自的 $document_root
里了,于是,我们修改的root(root /home/wwwroot/www.csensix.com/public;
)就把权限限制在 public
目录之后,软件架构根目录下的application
等都无法访问了,那么此时我们要解决的问题是:既要保持 root /home/wwwroot/www.csensix.com/public;
,又要让虚拟站点有 /home/wwwroot/www.csensix.com
目录的访问权限,那么可以修改 /usr/local/nginx/conf/fastcgi.conf
配置文件:
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";
改成
fastcgi_param PHP_ADMIN_VALUE "open_basedir=/home/wwwroot/www.csensix.com/:/tmp/:/proc/";
但问题又来了,/usr/local/nginx/conf/fastcgi.conf
是公共配置文件,采用这种写死的方式会导致其他站点不可用,为了兼顾其他虚拟站点,if_not_empty
就派上用场了,修改方法为:
在 fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";
之后添加fastcgi_param PHP_ADMIN_VALUE $basedir if_not_empty; #注意nginx要在1.1.11版本之后
$basedir
变量就可以在 /usr/local/nginx/conf/vhost/www.csensix.com.conf
配置文件里的 include enable-php.conf
前赋值:set $basedir "open_basedir=/home/wwwroot/www.csensix.com/:/tmp/:/proc/";
优点:这样既满足了 ThinkPHP 5 的部署要求,又不影响其他站点的使用。
缺点:如果 $basedir
没有赋值(至少一个专属配置有赋值),nginx -t无法通过。