我有一个 Apache (2.2) 在 上为 Web 应用程序提供服务example.com
。该 Web 应用程序有一个可通过 访问的调试页面example.com/debug
。/debug
当前受 HTTP 基本身份验证保护。由于只有极少数用户有权访问调试页面,因此我想根据 IP 地址隐藏它并返回404
给未从我们的 VPN 访问的客户端。
仅基于 IP 地址提供 404 服务非常简单,具体描述如下https://serverfault.com/a/13071。但是当我添加身份验证时,用户看到的不是 ,401
而是404
。
基本上,我需要的是:
if ($REMOTE_ADDR ~ 10.11.12.*):
do_basic_auth (aka return 401)
else:
return 404
更新这有效:
<VirtualHost ...>
...
SetEnvIf REMOTE_ADDR 10.128.0.* HAS_debug=1
SetEnvIf REMOTE_ADDR 10.128.1.* HAS_debug=1
SetEnvIf REMOTE_ADDR 10.128.2.* HAS_debug=1
RewriteEngine On
RewriteCond %{ENV:HAS_debug} !=1
RewriteRule ^/debug($|/) - [R=404,L]
<Location /debug>
AuthType Basic
AuthName "hidden-debug"
AuthUserFile ...
Require valid-user
</Location>
</VirtualHost>
关键部分是重写外部的Location
。
答案1
如果您介意启用 mod_rewrite,您可以通过重写调试目录的请求(在父目录的 .htaccess 中)来隐藏来自未知 IP 的目录,如果 IP 未知则返回 404,并在调试目录中留下标准的基本身份验证 .htaccess,用于对到达该位置的用户进行身份验证。
RewriteEngine on
RewriteCond %{REMOTE_ADDR} !=<vpn ip>
RewriteRule ^debug($|/) - [L,R=404]
(此示例直接摘自未经授权的尝试返回 404 代码当我在谷歌搜索你需要的确切语法时发现)