Apache默认在当前目录下没有index.html入口就会显示网站根目录,让网站目录文件都暴露在外面,是一件非常危险的事,例如:数据库密码泄露,隐藏页面暴露等严重安全问题!

例如,访问米扑网站根目录: https://mimvp.com    会列出根目录

apache-setting-prohibit-access-to-the-site-directory

 

本文将详细介绍如何操作禁止显示apache网站根目录

进入apache的配置文件 httpd.conf 找到:

vim /etc/httpd/conf/httpd.conf

Options Indexes FollowSymLinks

修改为:

Options FollowSymLinks

修改后结果如下:

<Directory "/var/www/html">
 #    Options None                        

 #    Options Indexes FollowSymLinks
     Options FollowSymLinks

     AllowOverride All
     Order allow,deny
     Allow from all
</Directory>

其实就是将Indexes去掉,Indexes表示若当前目录没有index.html就会显示目录结构

重启Apache服务器  /etc/init.d/httpd restart

再访问米扑网站,就没问题了: https://mimvp.com

 

1. 禁止访问某些文件/目录

增加Files选项来控制,比如不允许访问 .inc 扩展名的文件,保护php类库:
<Files ~ ".inc$">
     Order allow,deny
     Deny from all
</Files>

 

禁止访问某些指定的目录:(可以用 <DirectoryMatch>   来进行正则匹配)

<Directory ~ "^/var/www/(.+/)*[0-9]{3}">
     Order allow,deny
     Deny from all
</Directory>

 

通过文件匹配来进行禁止,比如禁止所有针对图片的访问:

<FilesMatch .(?i:gif|jpeg|png)$>
     Order allow,deny
     Deny from all
</FilesMatch>

 

针对URL相对路径的禁止访问:

<Location /dir/>
     Order allow,deny
     Deny from all
</Location>

 

针对代理方式禁止对某些目标的访问(<ProxyMatch> 可以用来正则匹配),比如拒绝通过代理访问mimvp.com

<Proxy http://mimvp.com/*>
   Order allow,deny
   Deny from all
</Proxy> 

 

配置示例

<Directory "E:/Program Files/Apache Software Foundation/Apache2.2/htdocs">
#
# Possible values for the Options directive are "None", "All",
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important. Please see
# http://httpd.apache.org/docs/2.2/mod/core.html#options
# for more information.
# 就是这一行,只去掉indexes也可

#Options Indexes FollowSymLinks
Options FollowSymLinks
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# Options FileInfo AuthConfig Limit
#
AllowOverride None
#
# Controls who can get stuff from this server.
#
Order allow,deny
Allow from all
</Directory>

建议默认情况下,设置APACHE禁止用户浏览目录内容。

 

 

2. Apache拦截HTTP请求

有些时候,为了保证Web网站的安全性,将Apache服务器中一些危险的HTTP请求过滤掉

例如 DELETE请求,也可以将系统不作处理的无效请求过滤,例如TRACE、OPTIONS请求,以防入侵者发送大量请求给服务器,造成系统负担。

Apache服务器可以通过修改http.conf文件来达到上述目的,Apache核心指令中:

<Limit>/<LimitExcept>配置段用于对指定的HTTP方法进行访问控制

<Directory>/<Files>/<Location>配置段则是用于将它们封装起来的指令集作用于指定的目录、文件或网络空间。

因此,将<Limit>/<LimitExcept>配置段和<Directory>/<Files>/<Location>配置段联合起来,就能实现Apache对指定HTTP请求进行访问控制的功能。

它们的配置形式(以<Directory>和<Limit>/<LimitExcept>说明)可以表示如下:

<Directory "/var/www/html">  
<Limit DELETE TRACE OPTIONS>  
    #禁止DELETE TRACE OPTIONS请求  
    Order allow,deny  
    Deny from all  
</Limit>  
</Directory>  

上述配置表示,对于任何用 DELETE、TRACE、OPTIONS 方法访问 /var/www/html 目录里资源文件的请求都会被apache服务器拒绝(403 Fobidden)。

还可以这样表示:

<Directory "/var/www/html">  
<LimitExcept GET POST HEAD>  
    #禁止除GET POST HEAD以外的请求  
    Order allow,deny  
    Deny from all  
</Limit>  
</Directory>  

这段配置表示,对于任何用 GET、POST、HEAD 方法访问 /var/www/html 目录里资源文件的请求都会被apache服务器拒绝(403 Fobidden)。

相当于前一个(<Limit>)是黑名单策略,后一个(<LimitExcept>)是白名单策略。

关于这段配置有两点需要注意的地方:

1、配置完httpd.conf文件后,必须重启apache服务,配置才能生效。

2、<Limit>/<LimitExcept>配置段里的Order、Allow、Deny指令需加载mod_authz_host.so模块,否则无法使用

 

 

3. Apache Rewrite url 重定向功能的简单配置

Rewrite url重定向就是实现URL的跳转和隐藏真实地址,基于Perl语言的正则表达式规范。

平时帮助我们实现拟静态,拟目录,域名跳转,防止盗链,防特定资源攻击(如高并发访问mp3、video、图片等大资源文件)等

1)Apache Rewrite 配置方式

Apache下的Rewrite配置主要有两种

一种是针对整个apache服务器的配置,此种配置的Rewrite规则是直接在httpd.conf下书写。

配置步骤如下: 

(1)去除httpd.conf文件中"#LoadModule rewrite_module modules/mod_rewrite.so"前面的"#"号; 

(2)然后再在httpd.conf中书写如下规则: 

RewriteEngine on 

#当访问任何以t_开头,以.html结尾的文件时,将$1用与(.*)匹配的字符替换后,访问相应的test.php页面 
RewriteRule ^/t_(.*).html$ /test.php?id=$1 

另一种是针对apache服务器下的某一目录的配置,此种配置的Rewrite规则需在此目录下建立一个.htaccess文件来书写。

配置步骤如下: 

(1)去除httpd.conf文件中"#LoadModule rewrite_module modules/mod_rewrite.so"前面的"#"号; 
(2)修改httpd.conf文件中的"AllowOverride None"为"AllowOverride all",同时最好将Options也置为"all",否则可能会出问题。 
(3)在目录中建立.htaccess文件,并用记事本打开,书写如下规则: 
RewriteEngine on 
RewriteRule ^/t_(.*).html$ /test.php?id=$1 

 

2)Apache Rewrite 规则的书写 

RewriteEngine on 
RewriteRule ^/test([0-9]*).html$ /test.php?id=$1           // 以test开头、.html结尾的URL,[0-9]*匹配到$1
RewriteRule ^/new([0-9]*)/$ /new.php?id=$1 [R] 

RewriteEngine on 
#当我们访问的地址不是以www.mimvp.com开头的,那么执行下一条规则 
RewriteCond %{HTTP_HOST} !^www.mimvp.com [NC] 
RewriteRule ^/(.*) http://www.mimvp.com/ [L] 

 

Apache 实现301永久性重定向的方法

Apache模块 mod_alias的 Redirect 和 RedirectMatch命令,2个命令使用方法相似。

区别是后者RedirectMatch基于正则表达式匹配对当前的URL发送一个外部重定向语法为:

Redirect [status] URL-path URL

RedirectMatch [status] regex URL

status参数可以使用以下HTTP状态码:

permanent     返回一个永久性重定向状态码(301),表示此资源的位置变动是永久性的。

temp            返回一个临时性重定向状态码(302),这是默认值。

seeother      返回一个“参见”状态码(303),表示此资源已经被替代。

gone            返回一个“已废弃”状态码(410),表示此资源已经被永久性地删除了。如果指定了这个状态码,则URL参数将被忽略。

举例:

Redirect 301 /old/old.htm http://www.mimvp.com/new.htm
Redirect permanent /one http://mimvp.com/two
RedirectMatch 301 (.*).gif$ http://www.mimvp.com/images/$1.jpg


使用mod_rewrite重写URL方式

Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^mimvp.com
RewriteRule ^(.*)$ http://www.mimvp.com/$1 [R=permanent,L]

上面配置含义,判断当前服务器变量HTTP_HOST是否等于mimvp.com

为真就进行重写,按照R=permanent进行永久重定向,L表示并立即停止重写操作,并不再应用其他重写规则

下面是最终实现的.htaccess文件,同时也并入wordpress重写规则:

# BEGIN Mimvp Blog
<IfModule mod_rewrite.c>
	RewriteEngine On

	#Redirect
	Options +FollowSymLinks
	RewriteCond %{HTTP_HOST}   ^mimvp.com$
	RewriteCond %{HTTP_HOST}   !^$
	RewriteRule ^(.*)$ http://www.mimvp.com/$1 [R=301,L]

	#Rewrite(blog)
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteCond %{REQUEST_FILENAME} !-d
	RewriteRule ^blog/.* /blog/index.php [L]
	RewriteRule . -
</IfModule>
# END Mimvp Blog

 

3)Apache Rewrite 规则修正符 

1) R 强制外部重定向 
2) F 禁用URL,返回403HTTP状态码。 
3) G 强制URL为GONE,返回410HTTP状态码。 
4) P 强制使用代理转发。 
5) L 表明当前规则是最后一条规则,停止分析以后规则的重写。 
6) N 重新从第一条规则开始运行重写过程。 
7) C 与下一条规则关联 

如果规则匹配则正常处理,以下修正符无效 

8) T=MIME-type(force MIME type) 强制MIME类型 
9) NS 只用于不是内部子请求 
10) NC 不区分大小写 
11) QSA 追加请求字符串 
12) NE 不在输出转义特殊字符 \%3d$1 等价于 =$1

 

4)Apache Rewrite 简单示例

示例1:重写URL

原始URL:https://blog.mimvp.com/p2066.html
重写URL:https://blog.mimvp.com/?p=2066

重写规则:

^p([0-9]+)\.html      /?p=$1     [L]

正则基础知识:

^ 匹配开始,匹配URL地址的开头部分,对于RewriteRule而言,域名(https://blog.mimvp.com)不是URL地址的一部分,如上:?p=2066
() 分隔一个被捕获的表达式,如上:([0-9]+)
[] 定义字符类,如上:[0-9] 表示从0-9之间的数字
+ 说明前面的字符可以被重复匹配1次或数次,如上:[0-9]+,表示任何数字组合
\ 字符转义,如上:转义小圆点.
[L] 表示last,匹配成功后就停止匹配其它

 

示例2:生成伪静态html

(1)生成伪静态html

在<VirtualHost>段最后加入
RewriteEngine on
RewriteRule /goods([0-9]+).html /goods.php?id=$1 [PT] 

更标准的写法为:
RewriteRule ^(.*)/goods([0-9]+).html$ $1/goods.php?id=$2 [PT]

更简洁的写法:
/goods(\d+)\.html /goods\.php\?id=$1

第一个(0-9]+)对应参数$1,以此类推第二个对应$2

举例:
RewriteRule /forum-([0-9]+)-([0-9]+)\.html /forumdisplay.php?fid=$1&page=$2 [PT]

测试https://blog.mimvp.com/goods1.html 是否与/goods.php?id=1的内容相同

最后将所有链接换成设置后的伪静态html地址方式

[PT]:url全局转换,即转换过的goods31.html对应goods.php?id=31 (默认就是这个不加参数)
[R]:    url重定向  即使用goods31.html访问时,跳转到goods.php?id=31

 

示例3:防盗链

RewriteCrond %{HTTP_HOST} !mimvp.com [R=301,L]
RewriteRule ^(.*)$ http://www.mimvp.com/warning.html [R=301,L]

把不是来自upkiller.com的请求重定向到http://www.mimvp.com

更好的做法:
RewriteCond %{HTTP_REFERER} !^http://(www\.)?mimvp\.com/.*$ [NC]
RewriteRule \.(mp3|rar|jpe|gif)$ http://www.mimvp.com/warning.jpg [R=301,L]

 

示例4:防百度爬虫

RewriteCond %{HTTP_USER_AGENT} ^Baiduspider [OR]
RewriteRule ^(.*)$ http://www.google.com [R=301,L]

把来自百度的爬虫转到google

 

5)Apache Rewrite 应用实例

a) httpd.conf 

# blog.mimvp.com
<VirtualHost *:80>
	RewriteEngine on
	#RewriteRule   ^(.*)mimvp-proxy-lastest-free-proxy-ip  https://mimvp.com [L,R]
	RewriteRule   ^(.*)mimvp-proxy-lastest-free-proxy-ip  https://mimvp.com [R=permanent,L]
	RewriteRule   ^(.*)phpmyadmin  https://mimvp.com [R=permanent,L]

	ServerAdmin abc123@mimvp.com
	DocumentRoot /var/www/html/mimvp-blog
	ServerName blog.mimvp.com

	RewriteEngine on
	RewriteCond   %{HTTPS} !=on 
	RewriteRule   ^(.*)  https://%{SERVER_NAME}$1 [R=permanent,L]

	DirectoryIndex index.php 
	ErrorLog /var/log/blog.mimvp.com-error_log
	CustomLog /var/log/blog.mimvp.com-access_log common
</VirtualHost>

 

b).htaccess

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php [L] 
</IfModule>
# END WordPress

 

 

4. 封禁某些IP访问/只允许某些IP访问网站

如果要控制禁止某些非法IP访问,在Directory选项控制: 

<Directory "/var/www">
#   Options Indexes FollowSymLinks
    Options FollowSymLinks		# 禁用Indexes,防止根目录泄露
    AllowOverride All

# Controls who can get stuff from this server.
    Order allow,deny
    Allow from all

	Deny from 10.0.0.1 			# 阻止一个IP 
	Deny from 192.168.0.0/24 	# 阻止一个IP段 
</Directory>


只允许某些IP访问,适合允许内部或者合作公司访问: 

<Directory "/var/www">
#   Options Indexes FollowSymLinks
    Options FollowSymLinks		# 禁用Indexes,防止根目录泄露
    AllowOverride All

# Controls who can get stuff from this server.
	Order deny,allow 
	Deny from all 

	Allow from example.com 				# 允许某个域名 
	Allow from 10.0.0.1 				# 允许一个iP 
	Allow from 10.0.0.1 10.0.0.2 		# 允许多个iP 
	Allow from 10.1.0.0/255.255.0.0 	# 允许一个IP段,掩码对 
	Allow from 10.0.1 192.168 			# 允许一个IP段,后面不填写 
	Allow from 192.168.0.0/24 			# 允许一个IP段,网络号
</Directory>

 

禁止或允许某些IP访问,也可以从外部文件引入

1) 添加引入文件到 httpd.conf 

Include block_ip_demo.con[f]
Include block_ip_blog.con[f]

 

2)把禁止或允许IP添加到配置文件

本文米扑博客以禁止IP访问为例

cat /etc/httpd/conf/block_ip_demo.conf 
 deny from  117.131.216.197
 deny from  119.44.13.93
 deny from  113.222.238.160

方法跟httpd.conf直接禁止IP类似,只是在禁止IP量很大(如1000个、10000个)时,引入一个外部的conf配置文件管理会更方便、简洁

 

配置好 httpd.conf 文件后,需要重启Apache,才能生效

/etc/init.d/httpd  restart

 

 

参考推荐

Apache 封禁IP及IP段访问

httpd使用ssl模块配置HTTPS

Nginx使用ssl模块配置HTTPS

Nginx Redirect重定向所有子域名到www

Apache 实现https+Apache http访问转到https

Apache 服务器负载低访问慢的原因分析和优化方案