我有一个网站(在 Google Cloud 的 CentOS 上运行,Apache 2.4.37),它的名字是 awesomesite.co.id。
该网站上的某些页面(例如 awesomesite.co.id/dev123/secret.html)不应从任何网络访问,除非从列入白名单的 IP。因此,以下是我已经执行的操作:
- 已编辑
/etc/httpd/conf.d/awesome-site.conf
。我在其中添加了 2 个白名单 IP。
<VirtualHost *:80>
ServerName awesomesite.co.id
DocumentRoot /var/www/html/awesome
ErrorLog /var/log/httpd/awesome-site-error.log
CustomLog /var/log/httpd/awesome-site-requests.log combined
#commented for testing PHP proxy, allow both http and https work
RewriteEngine on
RewriteCond %{SERVER_NAME} =awesomesite.co.id
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
<Directory /dev123/*>
Order deny,allow
Deny from all
Allow from 123.123.100.100
Allow from 200.200.44.59
</Directory>
- 重新启动Apache:
systemctl restart http.service
我尝试在几台移动设备(所有不同的电信运营商)上访问 awesomesite.co.id/dev123/secret.html。结果是所有设备都可以正常访问该页面。
那么正确的方法是什么?
答案1
Allow
mod_access_compat 提供的、Deny
和指令Order
从 2.4 版开始已被弃用,并且不再起作用。
改用Require
:
Require ip 123.123.100.100
Require ip 200.200.44.59
该Require
指令由模块提供mod_authz_host
。
更多详情可参阅Apache HTTP 服务器文档
请注意CIDR 范围这Require ip 200.200.44.0/24
也是可能的(见这里更多示例):
在第二种形式中,ip.address 是 IP 地址、部分 IP 地址、网络/网络掩码对或网络/nnn CIDR 规范。可以使用 IPv4 或 IPv6 地址。