#进入虚拟主机配置文件
[root@aminglinux 111.com]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
#增加下列配置
<Directory /data/wwroot/111.com/upload> //把upload目录下所有的php禁止解析
php_admin_flag engine off //表示禁止解析php
## 增加下面的(两个F之间的)后,所有访问php都会是403
<FilesMatch (.*)\.php(.*)>
Order allow,deny
Deny from all
</FilesMatch>
</Directory>
2.检查读写并重启服务
[root@aminglinux 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@aminglinux 111.com]# /usr/local/apache2.4/bin/apachectl graceful
3.创建需要禁止解析php的目录,并把1个php文件放在目录下
[root@aminglinux ~]# cd /data/wwroot/111.com/
[root@aminglinux 111.com]# ls
123.php admin qq.png u=3062734635,4183904616&fm=96.jpg
[root@aminglinux 111.com]# mkdir upload/
[root@aminglinux 111.com]# ls
123.php admin qq.png u=3062734635,4183904616&fm=96.jpg upload
#在目录下创建一个php文件
[root@aminglinux 111.com]# cp 123.php upload/
4.访问这个文件,这里显示了403。当我们访问另一个目录的php文件的时候,显示能直接访问,所以这个限制解析php是指定了目录的,不影响我们其它目录。
[root@aminglinux 111.com]# curl -x192.168.10.120:80 '111.com/upload/123.php' -I
HTTP/1.1 403 Forbidden
Date: Mon, 08 Jan 2018 16:26:54 GMT
Server: Apache/2.4.29 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1
#当我们访问其他目录的php文件
[root@aminglinux 111.com]# curl -x192.168.10.120:80 '111.com/123.php'
123.com[root@centos001 111.com]#
5.注释掉后面加的代码的时候会出现什么状况呢,开始说到禁止解析php只需要最前面的就可以了。
#进入虚拟主机配置文件并注释掉
<FilesMatch (.*)\.php(.*)>
Order allow,deny
Deny from all
</FilesMatch>
#检查读写并重启服务
#再次访问目录下的php文件
[root@aminglinux 111.com]# curl -x192.168.10.120:80 '111.com/upload/123.php'
<?php
echo "123.com";
6.这里能看到直接显示源代码了,看起来不太美观
1.修改虚拟主机配置文件。本例意为当user_agent匹配到curl或者baidu.com时,都会触发规则显Forbidden
<IfModule mod_rewrite.c> //此处加载了一个模块
RewriteEngine on
#NC表示忽略大小写,OR表示或者,F相当于Forbidden
RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR]//
RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC]
RewriteRule .* - [F]
</IfModule>
2.检查读写并重启服务。注:要是没有加载模块还要去主配置文件里面加载哦
[root@aminglinux 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@aminglinux 111.com]# /usr/local/apache2.4/bin/apachectl graceful
3.访问。因为有curl触发了规则所以输出403
[root@aminglinux 111.com]# curl -x192.168.10.120:80 'http://111.com/123.php'
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /123.php
on this server.<br />
</p>
</body></html>
4.curl -A "123123" 指定user_agent
[root@aminglinux 111.com]# curl -A "123123" 192.168.10.120:80 '111.com/123.php'
abc.com
查看php配置文件的位置
[root@aminglinux ~]# cd /data/wwroot/111.com/
[root@centos001 111.com]# ls
123.php index.php
[root@aminglinux 111.com]# vi index.php
[root@aminglinux 111.com]# cat index.php
<?php
phpinfo();
cp php.ini-development /usr/local/php/etc/php.ini
#刷新浏览器不成功,可以再重启下服务
#打开配置文件
vim /usr/local/php7/etc/php.ini
#搜索 disable_functions
#修改成如下
disable_functions=eval,assert,popen,passthru,escapeshellarg,escapeshellcmd,passthru,exec,system,chroot,scandir,chgrp,chown,escapeshellcmd,escapeshellarg,shell_exec,proc_get_status,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,leak,popepassthru,stream_socket_server,popen,proc_open,proc_close
#重启服务 phpinfo可以添加到最后面
2. date.timezone 定义时区。 不定义的话有时会出现一些警告信息
#进入配置文件
[root@aminglinux 111.com]# vim /usr/local/php7/etc/php.ini
#搜索date.timezone
#修改为date.timezone = Asia/Shanghai
#搜索display
修改为display_errors = Off
3.配置error_log (错误日志)
刚才我们禁用phpinfo的时候,浏览器输出了一段错误信息。这个就是php开启了错误日志的输出功能,但是开启之后呢,我们的有些东西就会泄露出去。所以下面我们将介绍怎么设置错误日志的路径、级别和类型等
#进入配置文件
1.开启error_log
#搜索 log_errors
修改为log_errors = Off on = 打开 off = 关闭
2.定义错误日志的文件路径
#搜索error_log
修改为error_log = /tmp/php_errors.log
3.定义错误日志的级别,这里我们选择的是最不严谨的。E_NOTICE为生产环境中所选的
#搜索error_reporting
修改为error_reporting = E_ALL
#保存退出后,检查读写并重启服务。查看路径有没有生成,访问下或者刷新一下网页
[root@aminglinux 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@aminglinux 111.com]# /usr/local/apache2.4/bin/apachectl graceful
[root@aminglinux 111.com]# cd /tmp
[root@aminglinux tmp]# ls
php_errors.log //生成的文件
查看php_errors.log文件,会看到属主属组是daemon
[root@aminglinux tmp]# ls -l /tmp/php_errors.log
-rw-r--r--. 1 daemon daemon 432 1月 9 04:53 /tmp/php_errors.log
daemon实际上是httpd的属主,php_errors.log日志文件是以httpd这个进程的身份去生成的
[root@aminglinux tmp]# ps aux |grep httpd
root 2323 0.0 1.4 267872 14384 ? Ss 1月08 0:15 /usr/local/apache2.4/bin/httpd -k start
daemon 24263 0.0 0.8 554700 8644 ? Sl 04:46 0:00 /usr/local/apache2.4/bin/httpd -k start
daemon 24264 0.0 0.8 554700 8644 ? Sl 04:46 0:00 /usr/local/apache2.4/bin/httpd -k start
daemon 24267 0.0 1.1 687884 11172 ? Sl 04:46 0:00 /usr/local/apache2.4/bin/httpd -k start
root 24363 0.0 0.0 112676 984 pts/1 R+ 04:55 0:00 grep --color=auto httpd
[root@aminglinux tmp]# grep error_log /usr/local/php/etc/php.ini
; server-specific log, STDERR, or a location specified by the error_log
; Set maximum length of log_errors. In error_log information about the source is
;error_log = php_errors.log
;error_log = syslog
; OPcache error_log file name. Empty string assumes "stderr".
;opcache.error_log=
[root@aminglinux tmp]# touch /tmp/php_errors.log ; chmod /tmp/php_errors.log
[root@aminglinux tmp]# vim /usr/local/php7/etc/php.ini
#搜索open_basedir
修改为open_basedir = /data/wwroot/111.com:/tmp
2.检查读写并重启服务 3.正常访问的话,直接就能访问 4.若是服务器上跑了N多个站点,那应该怎么去做限制呢? 应该针对站点,这些网站去做open_basedir ,但php.ini是做不到的,因为php.ini是针对所有站点的 但我们可以在虚拟主机配置文件中设置,在apache虚拟主机配置文件中去设置/usr/local/apache2.4/conf/extra/httpd-vhosts.conf
[root@aminglinux tmp]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
#增加 保存并退出
php_admin_value open_basedir "/data/wwroot/111.com:/tmp/"
apache开启压缩 http://ask.apelearn.com/question/5528 apache2.2到2.4配置文件变更 http://ask.apelearn.com/question/7292 apache options参数 http://ask.apelearn.com/question/1051 apache禁止trace或track防止xss http://ask.apelearn.com/question/1045 apache 配置https 支持ssl http://ask.apelearn.com/question/1029