存档

文章标签 ‘php_admin_value’

nginx实现apache的功能php_admin_value open_basedir

2018年8月8日 没有评论

nginx实现apache的功能php_admin_value open_basedir

今天将apache下面的所有虚拟主机站点改成nginx+php-fpm模式运行
考虑到虚拟主机的安全性不受各个站点的影响,所以需要在nginx下实现和apache一样的功能:php_admin_value open_basedir
也就是所说的:防跨目录设置
在apache中,我们只要在加入php_admin_value open_basedir就可以实现
比如:站点路径为/www/webroot/aaa.com
那么就是:php_admin_value open_basedir “/www/webroot/aaa.com:/tmp”
加入tmp是为了不影响用户上传文件,因为会先往临时目录上传

接下来就要进入主题,如何在nginx实现apache的功能php_admin_value open_basedir

查阅了相关文档,本人推荐的实现方式只有1种,方便,快捷,可拓展
当然还有一种其次的推荐方式,先聊聊第一种推荐的吧

======================
第一种:

在每个虚拟主机的server {}的location ~ \.php$ {}中增加:
fastcgi_param PHP_ADMIN_VALUE “open_basedir=/www/webroot/aaa.com/:/tmp/”;
注意,nginx下面,如果你输入的是:aaa.com(而不是aaa.com/)(结尾有/),就会造成是模糊匹配
比如aaa.com额aaa.com.cn,这2个都可以有权限访问

保存,重启nginx+php-ftpm就可以实现效果了
但是,很不幸,如果你有多个虚拟主机站点,访问aaa.com一切正常,访问bbb.com会时而报错:
no input file specified

这个原因是你有多少个虚拟主机,就要把全部虚拟主机的server {}的location ~ \.php$ {}中增加上,不要只增加某一个
否则会报错:no input file specified

一开始我调试的时候,只加了一个aaa.com,其他没加,网上找了很多方法都不行,后来不知脑袋怎么就考虑到要把全部的加上。

===================
第二种:

这种方法不是很推荐,因为需要在每个网站的根目录下增加一个文件,不方便拓展和管理

在每个虚拟主机的根目录下,增加.user.ini文件
比如aaa.com/.user.ini
.user.ini文件的内容就是:
open_basedir=/www/webroot/aaa.com/:/tmp/

当然还需要开启php.ini中的2个参数
sudo vim /etc/php/5.6/fpm/php.ini
开启:
user_ini.filename
user_ini.cache_ttl

重启php-fpm就可以生效了,这个等于不用配置nginx,当然也可以不用重启php-fpm,等待user_ini.cache_ttl设置的时间后,自动生效

这种方法,如果需要把ftp给别人,或者当某个虚拟主机站点受到黑客的时候,会造成.user.ini被串改或者被删除,等待

所以,还需要将文件的权限设置下:
sudo chattr +i /www/webroot/aaa.com/.user.ini
这样ftp里面就无法修改,删除,重命名该文件
当你想要自己修改的时候,进入服务器
sudo chattr -i /www/webroot/aaa.com/.user.ini
就可以重新操作了(+和-参数的区别)
具体chattr命令的参数,可以自行百度

==========================

使用了第二种方法,可以只对某个虚拟主机增加.user.ini,其他虚拟主机访问的时候并不会出现报错:no input file specified
这点和第一种方法不一样,第一种方法必须要把所有的都加上,才能保证每个虚拟主机都能正常访问

css.php