Apache 访问控制

1.禁止访问某些域名

NameVirtualHost 221.*.*.*

<VirtualHost 221.*.*.*>

ServerName 221.*.*.*

<Location />

Order Allow,Deny

 Deny from all

</Location>

</VirtualHost>   

 

在配置apache 访问目录的权限时,经常可以看到以下配置。

<Directory "/www">
    Order Allow,Deny
</Directory>
<Files>,and <Location> .htaccess   这些标签里也经常见到
Allow和Deny可以用于apache的conf文件或者.htaccess文件中
   (配合Directory, Location, Files等),用来控制目录和文件的访问授权。

所以,最常用的是:

Order Deny,Allow

Allow from All

注意“Deny,Allow”中间只有一个逗号,也只能有一个逗号,有空格都会出错;

单词的大小写不限。上面设定的含义是先设定“先检查禁止设定,没有禁止的全部允许”,而第二句没有Deny,

也就是没有禁止访问的设定,直接就是允许所有访问了。

这个主要是用来确保或者覆盖上级目录的设置,开放所有内容的访问权。

Allow Deny用法:

Allow from all|host|env=[!]env-variable [host|env=[!]env-variable] ...

Allow from example.org
Allow from .net example.edu
Allow from 10.1.2.3
Allow from 192.168.1.104192.168.1.205
Allow from 10.1
Allow from 10172.20192.168.2
Allow from 10.1.0.0/255.255.0.0
Allow from 10.1.0.0/16
Allow from 2001:db8::a00:20ff:fea7:ccea    
IP6地址
Allow from 2001:db8::a00:20ff:fea7:ccea/10
SetEnvIfUser-Agent^KnockKnock/2\.0 let_me_in
<Directory"/docroot">
Order Deny,Allow
Deny from all
Allow from env=let_me_in
</Directory>
关于生效顺序问题,总结为几点
1.以最后的顺序为准  
 Order Deny,Allow
 Deny from all
 Allow from example.org   这个域名可以访问
2.以默认为准
<Directory"/www">  
Order Allow,Deny </Directory>
没有具体allow deny 指令,默认禁止所有访问
3.以显示为准
Order deny,allow
deny from all #全部都不能通行
今天来详细解析下
因版本不同,旧版apache(2.2)
     Apache2.2版本中,访问控制是基于客户端的主机名、IP地址以及客户端请求中的其他特征。
使用Order(排序), Allow(允许), Deny(拒绝),Satisfy(满足)指令来实现。
    在Apache2.4版本中,使用mod_authz_host这个新的模块,来实现访问控制,其他授权检查也以同样的方式来完成。旧的访问控制语句应当被新的授权认证机制所取代,即便Apache已经提供了mod_access_compat这一新模块来兼容旧语句。
  新旧语法对照
2.22.4
Order deny,allow #排序,先拒绝后允许

Deny from all #拒绝所有

Require all denied #拒绝所有
Order allow,deny #排序,先允许后拒绝

Allow from all #允许所有

Require all granted #允许所有
Order Deny,Allow #排序,先拒绝后允许

Deny from all #拒绝所有

Allow from example.org #允许example.org

Require host example.org #拒绝所有 允许ex
原文:http://httpd.apache.org/docs/2.4/upgrading.html

附:新版本常见访问控制指令

Require all granted #允许所有

Require all denied #拒绝所有

Require env env-var [env-var] ... #允许,匹配环境变量中任意一个

Require method http-method [http-method] ... #允许,特定的HTTP方法

Require expr expression #允许,表达式为true

Require user userid [ userid ] ... #允许,特定用户

Require group group-name [group-name] ... #允许,特定用户组

Require valid-user # #允许,有效用户

Require ip 10 172.20 192.168.2 #允许 特定IP

更多解释:http://httpd.apache.org/docs/trunk/mod/mod_authz_core.html
下面来讲解几个实例:
1.

Mixing old and new directives: NOT WORKING AS EXPECTED

DocumentRoot"/var/www/html"
<Directory"/">
AllowOverride None
Order deny,allow Deny from all #旧版指令 禁止一切访问 </Directory>
<Location"/server-status">
SetHandler server-status Require127.0.0.1 #新版指令 只允许127.0.0.1 访问
</Location>
使用 127.0.0.1访问——结果显示403 没有权限 无法访问 access.log - GET /server-status 403127.0.0.1 error.log - AH01797: client denied by server configuration:/var/www/html/server-status
   为什么访问被拒绝了,因为兼容旧版命令的模块 mod_access_compat 优先于mod_authz_host 这个模块,
所以旧版指令发挥了作用,Deny from all 访问被禁止。
2.
DocumentRoot"/var/www/html"
<Directory"/">
AllowOverride None
Require all denied #新版指令 拒绝所有 访问 </Directory>
<Location"/server-status">
SetHandler server-status Order deny,allow #旧版指令 只允许127.0.0.1 访问 Deny from all AllowFrom127.0.0.1
</Location> access.log - GET /server-status 200127.0.0.1
旧版指令发挥作用 127.0.0.1 被允许访问。
2.某目录禁止执行php脚本

以下两个目录中 禁止执行xxx.php 的文件

  • 修改Apache配置文件(添加在http.conf文件中)
<Directory /var/www/yunshuerqi/webroot/uploads>
<Files ~ ".php">
Order allow,deny
Deny from all
</Files>
</Directory>
<Directory /var/www/yunshuerqi/webroot/supp/Public/Uploads>
<Files ~ ".php">
Order allow,deny
Deny from all
</Files>
</Directory>
  • 在可写文件夹的目录下,建一个.htaccess文件,内容为:

    <Files ~ ".php">

    Order allow,deny

    Deny from all

    </Files>

    apache2.4以上版本:

    <Files ~ ".php">

    Require all denied

    </Files>