46、限制某个目录禁止解析php、限制user_agent、php的相关配置

懵懂的女人 提交于 2020-03-01 00:24:20

1、限制某个目录禁止解析php:

  <Directory /data/wwwroot/www.123.com/upload>
       php_admin_flag engine off
   </Directory>

注释:核心配置内容如上,curl测试时直接返回源代码,并未解析;

2、假设有一个目录可以上传图片,有可能被别有用心的人上传了php(木马类型)的文件,因为httpd加载了php的模块,只要访问php的请求就会解析,因为php有一些函数,一旦开放了上传文件的权限,肯定会被上传一些木马文件,一旦被执行,就能拿到服务器的root权限,或者被恶意篡改一些参数,导致服务器瘫痪;

 有一台服务器被入侵了,不知道是什么原因,也不知道入侵到什么程度,只知道公司的数据库泄露了,数据是一些电话号码,黑客并没有去删除数据,因为他知道这个服务器的数据库里电话号码每天都在增加,他可以源源不断获取新的电话号码,然后买给第三方来获利;

分析:把一个新的号码在这个服务器提交后,马上就有人打电话过来了,证明,黑客获得电话号码,到打电话给新用户,这套体系已经完全自动化,每天去抓电话号码队列,所以猜测网站的php程序存在漏洞,另一种就是sql注入的漏洞(可以把查询的sql通过一些特殊的提交,提交到服务器上,服务器就会把这个sql语句转换成正常的查询,最终获得一些数据回来);但是sql注入漏洞,很容易修复,只要在网站提交的入口,增加一些特殊符号的过滤,就能完全的阻断sql注入的漏洞。

解决办法:首先抓包,监控数据库的查询,写一个死循环的脚本,每隔一分钟抓一次查询数据,抓完以后生成一个日志文件;

查询日记文件后,发现有一条sql查询,和网站原生的查询不一样,通过日志定位到了时间点,然后就去web服务器上查看时间点的访问日志,通过日志查看到了一个非常特殊的请求,名字是以php结尾的文件,而且这个php文件是在图片的目录下进行访问的,然后去查看这个php 文件,发现这个文件内容是一句话木马,用来是获取服务器的权限,相当于在服务器开了一个后门;这个问题产生的根本原因,就是因为上传图片目录并没有禁止解析php

sql注入:就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。[1] 比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击;

禁止php解析:配置文件如下:

[root@localhost_002 extra]# vim httpd-vhosts.conf 
# Virtual Hosts
<VirtualHost *:80>
    ServerAdmin yuanhh@foreb.com
    DocumentRoot "/data/wwwroot/111.com"
    ServerName www.111.com
    ServerAlias www.example.com  www.2111.com
    #<Directory /data/wwwroot/111.com> 
    #<FilesMatch 123.php>  
    #    AllowOverride AuthConfig 
    #    AuthName "111.com user auth" 
    #    AuthType Basic
    #    AuthUserFile /data/.htpasswd 
    #    require valid-user 
   # </FilesMatch>
   # </Directory>
    #针对upload目录下所有php文件禁止解析;
     <Directory /data/wwwroot/111.com/upload>
        php_admin_flag engine off          #禁止解析php核心内容:
      <FilesMatch (.*)\.php(.*)>           #增加FilesMatch后,这里访问upload目录下Php都是403Forbidden;
       Order allow,deny
       Deny from all                       #如果不写这个deny,访问时会直接显示源代码;
      </FilesMatch>
   </Directory>

2:检测配置文件是否有错误,并重启欺负apache服务:

[root@localhost_002 extra]# /usr/local/apapche2.4/bin/apachectl -t
Syntax OK
[root@localhost_002 extra]# /usr/local/apapche2.4/bin/apachectl graceful

3:在根目录下创建upload目录,并新建一个php文件:

[root@localhost_002 extra]# cd /data/wwwroot/111.com/
[root@localhost_002 111.com]# mkdir upload
[root@localhost_002 111.com]# echo "123123" >upload/111.php

4:curl访问时是403forbidden;

[root@localhost_002 111.com]# curl -x127.0.0.1:80 'http://www.111.com/upload/111.php' -i
HTTP/1.1 403 Forbidden
Date: Tue, 09 Oct 2018 03:21:08 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.30
Content-Length: 223
Content-Type: text/html; charset=iso-8859-1

5:测试,这时候在虚拟主机配置文件里注释掉FilesMatch,然后看效果:

[root@localhost_002 extra]# vim httpd-vhosts.conf 
# Virtual Hosts
    #针对upload目录下所有php文件禁止解析;
     <Directory /data/wwwroot/111.com/upload>
        php_admin_flag engine off          #禁止解析php核心内容:
      #<FilesMatch (.*)\.php(.*)>           #增加FilesMatch后,这里访问upload目录下Php都是403Forbidden;
      # Order allow,deny
      # Deny from all                       #如果不写这个deny,访问时会直接显示源代码;
      #</FilesMatch>
   </Directory>

6:检测配置文件错误,并重新加载apache文件:

[root@localhost_002 extra]# /usr/local/apapche2.4/bin/apachectl -t
Syntax OK
[root@localhost_002 extra]# /usr/local/apapche2.4/bin/apachectl graceful

7:这时使用curl命令测试,会自己显示源代码,不太友好:

[root@localhost_002 extra]# curl -x127.0.0.1:80 'http://www.111.com/upload/111.php' 
123123

8:在浏览器访问www.111.com/upload/111.php,也会提示下载这个文件,这是因为无法访问源代码导致的;

9:这时再打开虚拟配置文件,去掉对FliesMatch的注释:

[root@localhost_002 extra]# vim httpd-vhosts.conf 
# Virtual Hosts
    #针对upload目录下所有php文件禁止解析;
     <Directory /data/wwwroot/111.com/upload>
        php_admin_flag engine off          #禁止解析php核心内容:
      <FilesMatch (.*)\.php(.*)>           #增加FilesMatch后,这里访问upload目录下Php都是403Forbidden;
       Order allow,deny
       Deny from all                       #如果不写这个deny,访问时会直接显示源代码;
      </FilesMatch>
   </Directory>

10:检测配置文件是否有错误,并重新加载配置文件:

[root@localhost_002 extra]# /usr/local/apapche2.4/bin/apachectl -t
Syntax OK
[root@localhost_002 extra]# /usr/local/apapche2.4/bin/apachectl graceful

注释:这时候再去访问浏览器时会显示403Forbidden,即也无法看到源代码的内容:

注释:即使去访问这个目录下一个不存在的php文件,也会显示403Forbidden:php解析操作主要是针对可以写的目录,服务器安全:

注释:一般网站可写的目录,都不需要php解析的,一般静态文件存放的目录(image目录)页不允许解析php的:

2、访问控制:user_agent限制

扩展:cc攻击,就是黑客通过肉鸡去同时访问某一个站点,超过服务器并发,就会导致宕机,没有什么特殊的,让站点超过并发导致严重超负荷宕机,但是CC攻击有一个规则的特征,就是user_agent是一致的,比如同一个ip,同一个标识等,遇到这种user_agent频繁访问的情况就可以断定是CC攻击了,我们可以通过限制它的user_agent来减轻服务器的压力,只需要让它正常访问的状态码变为403,用来减轻服务器的压力,因为403仅仅是一个请求,带宽耗费不会太大。

user_agent 是浏览器标识:curl   -A "123123" 指定user_agent

1、核心配置文件内容:

[root@localhost_002 extra]# cat httpd-vhosts.conf 
# Virtual Hosts
<VirtualHost *:80>
    ServerAdmin yuanhh@foreb.com
    DocumentRoot "/data/wwwroot/111.com"
    ServerName www.111.com
    ServerAlias www.example.com  www.2111.com
    #<Directory /data/wwwroot/111.com> 
    #<FilesMatch 123.php>  
    #    AllowOverride AuthConfig 
    #    AuthName "111.com user auth" 
    #    AuthType Basic
    #    AuthUserFile /data/.htpasswd 
    #    require valid-user 
   # </FilesMatch>
   # </Directory>
   # Directory针对user_agent
   <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{HTTP_USER_AGENT}  .*curl.* [NC,OR]        #条件
        RewriteCond %{HTTP_USER_AGENT}  .*baidu.com.* [NC]        #条件
        RewriteRule  .*  -  [F]
    </IfModule>

注释:在两个条件中用OR做一个连接符,或者的意思,匹配第一条规则或者第二条规则;

如果不加OR是并且的意思,表示匹配第一条规则和第二条规则,两条同时匹配才执行;

注释:NC表示忽略大小写,因为user_agent可能会是大写(Mozilla/5.0),首字母大写;

RewriteRule .*  - [F]表示Forbidden;

2、检测配置文件并重启服务:

[root@localhost_002 extra]# /usr/local/apapche2.4/bin/apachectl -t
Syntax OK
[root@localhost_002 extra]# /usr/local/apapche2.4/bin/apachectl graceful

3、在访问的时候,会显示403 (Forbidden),这是因为显示user_agent;

[root@localhost_002 extra]# curl -x127.0.0.1:80 'http://www.111.com/upload/111.php'  -I
HTTP/1.1 403 Forbidden
Date: Tue, 09 Oct 2018 06:46:07 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.30
Content-Type: text/html; charset=iso-8859-1
[root@localhost_002 extra]# curl -x127.0.0.1:80 'http://www.111.com/123.php' -I
HTTP/1.1 403 Forbidden
Date: Tue, 09 Oct 2018 06:46:30 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.30
Content-Type: text/html; charset=iso-8859-1

4、查看访问日记(刚刚访问的最后两条日记):

[root@localhost_002 extra]# tail ../../logs/111.com-access_log 
127.0.0.1 - - [09/Oct/2018:14:36:10 +0800] "HEAD http://www.111.com/upload/111.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [09/Oct/2018:14:36:10 +0800] "HEAD http://www.111.com/upload/111.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [09/Oct/2018:14:36:11 +0800] "HEAD http://www.111.com/upload/111.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [09/Oct/2018:14:36:13 +0800] "HEAD http://www.111.com/upload/111.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [09/Oct/2018:14:46:05 +0800] "HEAD http://www.111.com/upload/111.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [09/Oct/2018:14:46:07 +0800] "HEAD http://www.111.com/upload/111.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [09/Oct/2018:14:46:27 +0800] "GET http://www.111.com/123.php HTTP/1.1" 403 216 "-" "curl/7.29.0"
127.0.0.1 - - [09/Oct/2018:14:46:30 +0800] "HEAD http://www.111.com/123.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [09/Oct/2018:14:47:54 +0800] "HEAD http://www.111.com/upload/111.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [09/Oct/2018:14:48:02 +0800] "HEAD http://www.111.com/123.php HTTP/1.1" 403 - "-" "curl/7.29.0"

5、测试是否是因为user_agent才会被访问:

自定义user_agent:   -A   自定义:

[root@localhost_002 extra]# curl -A "fenye" -x127.0.0.1:80 'http://www.111.com/123.php' -I
HTTP/1.1 200 OK
Date: Tue, 09 Oct 2018 07:09:18 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.30
X-Powered-By: PHP/5.6.30
Content-Type: text/html; charset=UTF-8
[root@localhost_002 extra]# !tail
tail ../../logs/111.com-access_log 
192.168.149.135 - - [09/Oct/2018:15:06:51 +0800] "GET /123.php HTTP/1.1" 200 6 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
192.168.149.135 - - [09/Oct/2018:15:08:35 +0800] "GET /123.php HTTP/1.1" 200 6 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
192.168.149.135 - - [09/Oct/2018:15:08:35 +0800] "GET /123.php HTTP/1.1" 200 6 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
127.0.0.1 - - [09/Oct/2018:15:09:18 +0800] "HEAD http://www.111.com/123.php HTTP/1.1" 200 - "-" "fenye"

注释:curl命令是一个利用URL规则在命令行下工作的文件传输工具
-A ,指定user-agent,设置用户代理发送给服务器
-e ,指定referer,就是来源网址
-I ,仅仅查看它的状态码
-x ,在指定的端口上使用HTTP代理

3、php的相关配置

查看php的配置文件位置及相关参数

/usr/local/php/bin/php -i|grep -i "loaded configuration file" 
date.timezone 
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 
error_log, log_errors, display_errors, error_reporting
open_basedir
php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/"

1、查看php的配置位置:

可以通过浏览器访问phpinfo找到配置文件的路径:

也可以通过 /usr/local/php/bin/php -i|grep "loaded configuration file"找到它的路径,但是有些php -i是不准的,因为apache是调用了php的一个模块,而php -i是php的一个程序,它和libphp5.so可能有关系也可能没关系;

例如:有时候改动了php.ini文件,重启了服务后还是不生效,因为php -i找到的配置文件和在web上phpinfo找到phi.ini不是同一个,如果想找的准确一点,就需要在对应站点的目录下创建一个phpinfo的php文件,在浏览器里打开phpinfo里看到才是最准确的;

[root@localhost_002 111.com]# ls
123.php  admin.php  image  index.php  info.php  upload
[root@localhost_002 111.com]# cat index.php
<?
phpinfo();
?>
[root@localhost_002 111.com]# cp /usr/local/src/php-7.1.6/php
php7.spec            php7.spec.in         php.gif              php.ini-development  php.ini-production   
[root@localhost_002 111.com]# cp /usr/local/src/php-7.1.6/php.ini-development /usr/local/php7/etc/php.ini
[root@localhost_002 111.com]# /usr/local/apapche2.4/bin/apachectl graceful
这时候再用流浪器来访问即可:

disable_functions    安全函数

eval 如之前提到的一句话木马涉及到函数,如果把这个函数禁用了,即使上传了一句话木马也不会生效;

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 以上是比较危险的函数

2、那如何禁止了?        配置文件  /usr/local/php7/etc/pin.ini  ---->  搜索   disable

搜索diable

在disable_functions = 后添加(禁掉)一些函数:

[root@localhost_002 111.com]# vim /usr/local/php/etc/php.ini 
cat /usr/local/php/etc/php.ini |grep disable_functions
#搜索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,phpinfo

注释:当然也可以禁掉phpinfo,很多企业在生成环境中都会禁止掉,因为php涉及到服务器的很多配置信息相关,如果不小心上传到线上,容易被黑客查到,实施攻击;

3、重新加载配置文件:

[root@localhost_002 111.com]# /usr/local/apapche2.4/bin/apachectl graceful

4、在去浏览器访问时,会显示phpinfo被禁止掉了;

5、打开php配置文件:定义如下:    date.timezone            display_errors

1、定义date.timezone时区,如过不定义,有时候会有写告警信息;

display_errors - On (On表示显示 Off不显示),意思是是否把错误信息显示在浏览器上,这样会把目录给暴露出来,更改为display_errors = Off

[root@localhost_002 ~]# vim /usr/local/php7/etc/php.ini 
;删除前面的分号,后面添加Asia/Shanghai或者Asia/Chongqing
date.timezone = Asia/Shanghai

; display_errors
;删除前面的分号,将display_errors = On 改为  display_errors = Off
display_errors = Off
; separately from display_errors. PHP's default behavior is to suppress those

2、检测配置文件是否错误,重新启动apache服务;

[root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl -t
Syntax OK
[root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl graceful

3、这是去浏览器再次访问:www.111.com/index.php 会发现出现白页,这是因打开display_errors参数;

4、配置错误日记(因为修改display_errors的不显示),错误日记是很有必要的;

log_errors = On             #定义错误日记开关(On表示打开;  Off表示关闭)

error_log = /tmp/php_error.log              #定义错误日记路径;

error_reporting = E_ALL  定义日记级别,默认为ALL,表示把所有的error都记录下来,这是最不严谨的;

注释:生产环境中,使用; E_ALL & ~E_NOTICE (Show all errors, except for notices) 通知

[root@localhost_002 ~]# cat /usr/local/php7/etc/php.ini |grep log_errors
; log_errors
;打开错误日记开关;
log_errors = On           
; Set maximum length of log_errors. In error_log information about the source is
log_errors_max_len = 1024
;指定错误日日记的位置  /tmp/php_errors.log
error_log = /tmp/php_errors.log

5、检测配置文件是否存在错误,并重新加载apache;

[root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl -t
Syntax OK
[root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl graceful

6、再次用crul命令访问下,会看到/tmp/目录下生成了php_errors.log

[root@localhost_002 ~]# curl -A 'fenye' -x 127.0.0.1:80 www.111.com/index.php
[root@localhost_002 ~]# cat /tmp/php_errors.log           #错误日记内容;
[09-Oct-2018 18:20:22 Asia/Shanghai] PHP Warning:  phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2
错误日记文件类型:
[root@localhost_002 ~]# ll /tmp/php_errors.log 
-rw-r--r-- 1 daemon daemon 145 10月  9 18:20 /tmp/php_errors.log

注释:如上所示,会看到php_error.log的文件所属主和组是daemon,而daemon实际是httpd的属主;

所以php_error.log是以httpd这个进程的身份去运行的;

注释:如果有时候定义的错误日记一直没有生成的话,则要看看定义错误日记所在目录有没有写权限(这个写文件的人是daemon);

保险一点,就是在所在目录下创建一个错误日记文件,然后赋予它777权限,这样就不用担心httpd是否有写权限了;

[root@localhost_002 ~]# cat /usr/local/php7/etc/php.ini |grep error_log
; 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 = /tmp/php_errors.log  
;error_log = syslog
[root@localhost_002 ~]# touch /tmp/php_errors.log ; chmod 777 /tmp/php_errors.log

7、查看错误日记文件:  提示因为安全原因,这个函数被禁掉了;

[root@localhost_002 ~]# cat /tmp/php_errors.log           #错误日记内容;
[09-Oct-2018 18:20:22 Asia/Shanghai] PHP Warning:  phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2

3、安全相关参数open_basedir

如:一台服务器上,运行了多个站点,其中有个站点的代码有问题,被黑客攻击了并且拿到了权限,黑客拿了权限会继续往里面渗透,就有可能渗透到其他站点,导致其他站点也被黑;

 多个站点  A网站在A目录;   B网站在B目录;    互相隔离;

一个站点  也可以只把它限制在这个目录,只能在这个目录活动;

open_basedir  它是一个安全选项,限制不能串岗;只能给它限制在这个目录下活动;

1、配置:打开配置文件:     /usr/local/php7/etc/php.ini

[root@localhost_002 ~]# cat /usr/local/php7/etc/php.ini |grep open_basedir
; open_basedir, if set, limits all file operations to the defined directory
open_basedir = /data/wwwroot/111.com:/tmp
;删除分号,并添加目录,多个目录有冒号隔开;

扩展注释:此处如果不小心写错了目录,访问是会报500的错误,查看错误日记提示没有权限;

[root@localhost_002 ~]# curl -A 'fenye' -x 127.0.0.1:80 www.111.com/index.php -I
HTTP/1.0 500 Internal Server Error
Date: Tue, 09 Oct 2018 10:51:21 GMT
[root@localhost_002 ~]# tail /tmp/php_errors.log 
[09-Oct-2018 18:52:10 Asia/Shanghai] PHP Warning:  Unknown: open_basedir restriction in effect. File(/data/wwwroot/111.com/index.php) is not within the allowed path(s): (/data/wwwroot/1111.com:/tmp) in Unknown on line 0
[09-Oct-2018 18:52:10 Asia/Shanghai] PHP Warning:  Unknown: failed to open stream: Operation not permitted in Unknown on line 0
[09-Oct-2018 18:52:10 Asia/Shanghai] PHP Fatal error:  Unknown: Failed opening required '/data/wwwroot/111.com/index.php' (include_path='.:/usr/local/php7/lib/php') in Unknown on line 0

2、检测配置文件是否有错误,并重启apache;

[root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl -t
Syntax OK
[root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl graceful

3、再次访问,会显示正常;

[root@localhost_002 ~]# curl -A 'fenye' -x 127.0.0.1:80 www.111.com/index.php  -I
HTTP/1.1 200 OK
Date: Tue, 09 Oct 2018 10:55:32 GMT
Server: Apache/2.4.34 (Unix) PHP/7.1.6
X-Powered-By: PHP/7.1.6
Content-Type: text/html; charset=UTF-8

4:若是服务器上跑了多个站点,那怎么来限制了???

应该是针对站点这些网站去做open_basedir,但php.ini是做不到,因为php.ini是针对所有站点的(这样也没意义);

但我们可以在虚拟主机里去设置,apache的虚拟主机配置文件中针对不同的虚拟主机去设置open_basedir;

注释:多个站点要在虚拟主机里设置open_basedir时,需要每个站点都指定,如果只指定了一个站点,那其他的站点也就没办法访问了;

注释:也可以在虚拟主机配置文件设置error_log错误日记的位置及error_reporting日记级别等;

[root@localhost_002 abc.com]# vim /usr/local/apapche2.4/conf/extra/httpd-vhosts.conf 
# Virtual Hosts
<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "/data/wwwroot/abc.com"
    ServerName  abc.com
    ServerAlias www.abc.com   www.123.com
    ErrorLog "logs/abc.com-error_log"
    CustomLog "logs/abc.com-access_log" common
    php_admin_value open_basedir "/data/wwwroot/abc.com:/tmp/"    #定义open_basedir;
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin yuanhh@foreb.com
    DocumentRoot "/data/wwwroot/111.com"
    ServerName www.111.com
    ServerAlias www.example.com  www.2111.com
    #<Directory /data/wwwroot/111.com>                          #用户验证;
    #<FilesMatch 123.php>  
    #    AllowOverride AuthConfig 
    #    AuthName "111.com user auth" 
    #    AuthType Basic
    #    AuthUserFile /data/.htpasswd 
    #    require valid-user 
   # </FilesMatch>
   # </Directory>
   # Directory针对目录进行
   php_admin_value open_basedir "/data/wwwroot/111.com:/tmp"     #定义open_basedir
   <IfModule mod_rewrite.c>                                      #针对user_agent做限制(cc攻击);
        RewriteEngine on
        RewriteCond %{HTTP_USER_AGENT}  .*curl.* [NC,OR]        #条件
        RewriteCond %{HTTP_USER_AGENT}  .*baidu.com.* [NC]        #条件
        RewriteRule  .*  -  [F]
    </IfModule>
   <Directory /data/wwwroot/111.com/upload>                  #某些目录不解析php;
      php_admin_flag engine off
      <FilesMatch (.*)\.php(.*)>
       Order allow,deny
       Deny from all
     </FilesMatch>
   </Directory>
   <Directory /data/wwwroot/111.com>                        #针对目录做验证;
      <FilesMatch admin.php(.*)>
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
     </FilesMatch>
    </Directory>
   <Directory /data/wwwroot/111.com>                            #防盗链;
        SetEnvIfNoCase Referer "http://www.111.com" local_ref
        SetEnvIfNoCase Referer "http://www.example.com" local_ref
        SetEnvIfNoCase Referer "^$" local_ref
        <filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)">
            Order Allow,Deny
            Allow from env=local_ref
        </filesmatch>
   </Directory>
   <IfModule mod_rewrite.c>                                      #重定向;                          
     RewriteEngine on 
     RewriteCond %{HTTP_HOST} !^www.111.com$  
     RewriteRule ^/(.*)$ http://www.111.com/$1 [R=301,L]
   </IfModule>
    ErrorLog "logs/111.com-error_log" 
    CustomLog "logs/111.com-access_log" combined
</VirtualHost>

5、检测配置文件是否有错误,重新加载配置文件;

[root@localhost_002 abc.com]# /usr/local/apapche2.4/bin/apachectl -t
Syntax OK
[root@localhost_002 abc.com]# /usr/local/apapche2.4/bin/apachectl graceful

6、curl命令测试

虚拟主机里第一个网站访问;   www.123.com
[root@localhost_002 abc.com]# curl   -x 127.0.0.1:80 www.123.com/index.php  -I
HTTP/1.1 200 OK
Date: Tue, 09 Oct 2018 11:15:22 GMT
Server: Apache/2.4.34 (Unix) PHP/7.1.6
X-Powered-By: PHP/7.1.6
Content-Type: text/html; charset=UTF-8
虚拟主机第二个网站访问; www.111.com
[root@localhost_002 abc.com]# curl  -A "fenye" -x 127.0.0.1:80 www.111.com/index.php  -I
HTTP/1.1 200 OK
Date: Tue, 09 Oct 2018 11:15:42 GMT
Server: Apache/2.4.34 (Unix) PHP/7.1.6
X-Powered-By: PHP/7.1.6
Content-Type: text/html; charset=UTF-8

注释:因为第二个站点开了user_agent(禁止了curl标识),只能通过curl  -A "新标示" 的方式来访问;

7、浏览器访问;

第一个站点:www.123.com

第二个站点:www.111.com

 

扩展:

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!