我们希望建立一个仅用于演示目的的网站,以便我们可以:
- 通过 HTTP Basic Auth 输入用户名和密码即可从互联网上的任何地方访问。
- 为了方便使用,我们希望不必通过办公室的 HTTP Basic Auth,我们的办公室将从 202.161.24.210 进行连接。
- 演示站点的某些部分需要向其自身发出 REST 请求,因此我们也希望将 127.0.0.1 和 ::1 列入白名单。
我们似乎已经实现了 2 和 3,但 1 并没有像我们想象的那样顺利,我们的用户不断收到 HTTP Basic Auth 用户名和密码的重新提示,即使他们已经通过身份验证并正在转到网站的不同页面。我们从日志中注意到,他们在访问某些资产时收到以下错误消息:
[Tue Jun 09 10:50:03.442834 2015] [access_compat:error] [pid 5740:tid 140705259312896] [client 78.52.242.163:62774] AH01797: client denied by server configuration: /var/www/docroots/stage/lib/yui/build/moodle-core-checknet/assets/checknet.txt, referer: http://stage.example.org/mod/scorm/player.php
这是我们的 Apache vhost:
<VirtualHost *:80>
ServerName stage.example.org
DocumentRoot /var/www/docroots/stage
<Directory /var/www/docroots/stage>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
# Only visible on Office network or anyone with a valid password.
AuthType Basic
AuthName "Authorisation Required"
AuthUserFile "/var/www/htpasswd"
Require valid-user
Order allow,deny
Allow from 202.161.24.210 127 ::1
Satisfy any
</Directory>
</VirtualHost>
我们在 CentOS 7 上运行 Apache 2.4.6。我们的配置正确吗?我们的配置似乎对顶级文件以及/var/www/docroots/stage
其直接下属子目录下的其他图像、css 和 javascript 文件有效,但可能是它在经过一定数量的子目录后忘记了 HTTP Auth?SELinux 处于宽容模式。
答案1
如果没有完整的错误消息(我希望是模块和 ip 地址),这有点像猜测,但你混合了 Apache 2.4 中两个不同模块的指令, Require
来自 mod-authz-core 的指令和“遗产”指令Allow
和 Order
来自 mod-access-compat,可能堆叠效果不是很好。
您可以尝试更换线路
Order allow,deny
Allow from 202.161.24.210 127 ::1
使用以下内容
Require ip 202.161.24.210 127 ::1/128
已经存在的Satisfy any
这应该可以满足你的要求。
你的第三个要求:
演示站点的某些部分需要向其自身发出 REST 请求...
可能不会像您预期的那样从环回地址访问服务器,但可能配置了类似于服务器公共 IP 地址的 FQDNhttp://api.example.com/rest?
并且源自服务器的公共 IP 地址。
您可以添加服务器的公共 IP 地址,但从 Apache 2.4 开始更容易解决;本地供应商如果以下任一条件成立,则允许访问服务器:
- 客户端地址与 127.0.0.0/8 匹配
- 客户端地址是::1
- 两个都连接的客户端和服务器地址相同
因此,不要列出环回 IP 地址,而是使用:
Require valid-user
# Office Gateway:
Require ip 202.161.24.210
# API access from this host:
Require local
# Only one or more of the above needs to match:
Satisfy any