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.2 | 2.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
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>