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
更多解释: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>

原文地址:https://www.cnblogs.com/centos2017/p/7896770.html