我在AWS EC2,64位Amazon Linux v2.1.3,PHP 5.6上使用Joomla的服务器,我们希望阻止访问/ administrator文件夹php文件,但我们的办公室IP和ip除外服务器,因为该文件夹包含不在该文件夹中的脚本使用的库。
我使用LocationMatch将以下内容放在一起,但它无效。访问服务器不受限制。
我对Apache不是很熟悉,特别是对于SetEnvIf。以下设置env = allow无论如何?有没有办法测试?还有什么不对吗?
<LocationMatch "/(administrator|tmpl)">
SetEnvIf Request_URI "\.(css|js|html|htm|gif|jpg|png|jpeg)$" allow
Deny from all
##except if either of these are satisfied
Satisfy any
##1. a valid authenticated user
Allow from ip1 ip2
## or 2. allow is set
Allow from env=allow
</LocationMatch>
答案 0 :(得分:1)
Satisfy
指令才有用:使用Any
选项,客户端将是如果他们通过主机限制或输入有效的用户名和密码,则授予访问权限。由于您没有任何用户限制,因此您Satisfy any
有效地授予所有人访问权限。
由于你运行2.4,这应该有效:
<LocationMatch "/(administrator|tmpl)">
SetEnvIf Request_URI "\.(css|js|html|htm|gif|jpg|png|jpeg)$" allow
<RequireAny>
Require env allow
Require ip 10.0.2.2 10.0.2.3
</RequireAny>
</LocationMatch>
如果您的服务器位于ELB之后,则与Apache的连接将来自负载均衡器,而不是直接来自客户端,因此无法在Require ip
中使用IP地址。但是ELB添加了几个请求头,以便将这些信息传递给源服务器,其中一个是X-Forwarded-For
,它将包含客户端的IP地址。如果原始请求已包含此标头(这根本不常见),ELB会将客户端IP地址附加到现有值,因此您将获得以逗号+空格分隔的IP地址列表。最后(最右边)的IP地址始终是连接到最后一个代理(您的ELB)的IP地址,这意味着您要测试的IP地址,请尝试:
<LocationMatch "/(administrator|tmpl)">
SetEnvIf Request_URI "\.(css|js|html|htm|gif|jpg|png|jpeg)$" allow
SetEnvIf X-Forwarded-For x.x.x.x$ office
SetEnvIf X-Forwarded-For y.y.y.y$ bar
<RequireAny>
Require env allow
Require env office
Require env bar
</RequireAny>
</LocationMatch>