一、限制某個目錄禁止解析php:php
<Directory /data/wwwroot/www.123.com/upload> php_admin_flag engine off </Directory>
註釋:核心配置內容如上,curl測試時直接返回源代碼,並未解析;html
二、假設有一個目錄能夠上傳圖片,有可能被別有用心的人上傳了php(木馬類型)的文件,由於httpd加載了php的模塊,只要訪問php的請求就會解析,由於php有一些函數,一旦開放了上傳文件的權限,確定會被上傳一些木馬文件,一旦被執行,就能拿到服務器的root權限,或者被惡意篡改一些參數,致使服務器癱瘓;web
有一臺服務器被入侵了,不知道是什麼緣由,也不知道入侵到什麼程度,只知道公司的數據庫泄露了,數據是一些電話號碼,黑客並無去刪除數據,由於他知道這個服務器的數據庫裏電話號碼天天都在增長,他能夠源源不斷獲取新的電話號碼,而後買給第三方來獲利;sql
分析:把一個新的號碼在這個服務器提交後,立刻就有人打電話過來了,證實,黑客得到電話號碼,到打電話給新用戶,這套體系已經徹底自動化,天天去抓電話號碼隊列,因此猜想網站的php程序存在漏洞,另外一種就是sql注入的漏洞(能夠把查詢的sql經過一些特殊的提交,提交到服務器上,服務器就會把這個sql語句轉換成正常的查詢,最終得到一些數據回來);可是sql注入漏洞,很容易修復,只要在網站提交的入口,增長一些特殊符號的過濾,就能徹底的阻斷sql注入的漏洞。shell
解決辦法:首先抓包,監控數據庫的查詢,寫一個死循環的腳本,每隔一分鐘抓一次查詢數據,抓完之後生成一個日誌文件;數據庫
查詢日記文件後,發現有一條sql查詢,和網站原生的查詢不同,經過日誌定位到了時間點,而後就去web服務器上查看時間點的訪問日誌,經過日誌查看到了一個很是特殊的請求,名字是以php結尾的文件,並且這個php文件是在圖片的目錄下進行訪問的,而後去查看這個php 文件,發現這個文件內容是一句話木馬,用來是獲取服務器的權限,至關於在服務器開了一個後門;這個問題產生的根本緣由,就是由於上傳圖片目錄並無禁止解析phpapache
sql注入:就是經過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。具體來講,它是利用現有應用程序,將(惡意的)SQL命令注入到後臺數據庫引擎執行的能力,它能夠經過在Web表單中輸入(惡意)SQL語句獲得一個存在安全漏洞的網站上的數據庫,而不是按照設計者意圖去執行SQL語句。[1] 好比先前的不少影視網站泄露VIP會員密碼大多就是經過WEB表單遞交查詢字符暴出的,這類表單特別容易受到SQL注入式攻擊;vim
禁止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的:
二、訪問控制:user_agent限制
擴展:cc攻擊,就是黑客經過肉雞去同時訪問某一個站點,超過服務器併發,就會致使宕機,沒有什麼特殊的,讓站點超過併發致使嚴重超負荷宕機,可是CC攻擊有一個規則的特徵,就是user_agent是一致的,好比同一個ip,同一個標識等,遇到這種user_agent頻繁訪問的狀況就能夠判定是CC攻擊了,咱們能夠經過限制它的user_agent來減輕服務器的壓力,只須要讓它正常訪問的狀態碼變爲403,用來減輕服務器的壓力,由於403僅僅是一個請求,帶寬耗費不會太大。
user_agent 是瀏覽器標識:curl -A "123123" 指定user_agent
一、核心配置文件內容:
[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;
二、檢測配置文件並重啓服務:
[root@localhost_002 extra]# /usr/local/apapche2.4/bin/apachectl -t Syntax OK [root@localhost_002 extra]# /usr/local/apapche2.4/bin/apachectl graceful
三、在訪問的時候,會顯示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
四、查看訪問日記(剛剛訪問的最後兩條日記):
[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"
五、測試是不是由於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代理
三、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/"
一、查看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 以上是比較危險的函數
二、那如何禁止了? 配置文件 /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涉及到服務器的不少配置信息相關,若是不當心上傳到線上,容易被黑客查到,實施攻擊;
三、從新加載配置文件:
[root@localhost_002 111.com]# /usr/local/apapche2.4/bin/apachectl graceful
四、在去瀏覽器訪問時,會顯示phpinfo被禁止掉了;
五、打開php配置文件:定義以下: date.timezone display_errors
一、定義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
二、檢測配置文件是否錯誤,從新啓動apache服務;
[root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl -t Syntax OK [root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl graceful
三、這是去瀏覽器再次訪問:www.111.com/index.php 會發現出現白頁,這是因打開display_errors參數;
四、配置錯誤日記(由於修改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
五、檢測配置文件是否存在錯誤,並從新加載apache;
[root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl -t Syntax OK [root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl graceful
六、再次用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
七、查看錯誤日記文件: 提示由於安全緣由,這個函數被禁掉了;
[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
三、安全相關參數: open_basedir
如:一臺服務器上,運行了多個站點,其中有個站點的代碼有問題,被黑客攻擊了而且拿到了權限,黑客拿了權限會繼續往裏面滲透,就有可能滲透到其餘站點,致使其餘站點也被黑;
多個站點 A網站在A目錄; B網站在B目錄; 互相隔離;
一個站點 也能夠只把它限制在這個目錄,只能在這個目錄活動;
open_basedir 它是一個安全選項,限制不能串崗;只能給它限制在這個目錄下活動;
一、配置:打開配置文件: /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
二、檢測配置文件是否有錯誤,並重啓apache;
[root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl -t Syntax OK [root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl graceful
三、再次訪問,會顯示正常;
[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>
五、檢測配置文件是否有錯誤,從新加載配置文件;
[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
六、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 "新標示" 的方式來訪問;
七、瀏覽器訪問;
第一個站點: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