У меня есть Apache (2.2), обслуживающий веб-приложение на example.com
. В этом веб-приложении есть страница отладки, доступная через example.com/debug
. /debug
в настоящее время защищен базовой аутентификацией HTTP. Поскольку есть только очень небольшая база пользователей, у которой есть доступ к странице отладки, я хотел бы скрыть ее на основе IP-адреса и вернуть 404
клиентам, не имеющим доступа к нашему VPN.
Обслуживание 404 только на основе IP-адреса очень просто и описано в 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
.
Если у вас есть / не возражаете против включения mod_rewrite, вы можете скрыть каталог от неизвестных IP-адресов, переписав запросы для каталога отладки (в .htaccess в родительском каталоге), чтобы вернуть 404, если IP-адрес неизвестен, и оставить стандартный basic auth .htaccess в вашем каталоге отладки для аутентификации пользователей, которые зашли так далеко.
RewriteEngine on
RewriteCond %{REMOTE_ADDR} !=<vpn ip>
RewriteRule ^debug($|/) - [L,R=404]
(Этот пример взят непосредственно из Возврат кода 404 при несанкционированных попытках нашел, когда искал в Google точный синтаксис, который вам нужен)