У меня есть веб-сервер Apache 2.4, который обслуживает некоторые файлы, которые должны быть видны публике, а другие должны быть видны только после аутентификации, которую я реализовал с помощью AuthType Basic
директива в .htaccess
файл.
К файлам с ограниченным доступом никогда не сможет получить доступ человек с браузером, а только из программного обеспечения, которое запрашивает их и включает учетные данные аутентификации в заголовок HTTP.
Если доступ к сайту осуществляется без предоставления учетных данных непосредственно в заголовке (например, в браузере), я хочу, чтобы Apache возвращал 401 Unauthorized
статус сразу и не показывать диалог аутентификации. Это возможно?
Я не думаю, что это возможно. В соответствии с https://httpstatuses.com/401 ошибка 401 должна быть отправлена с полем WWW-аутентификации, которое, вероятно, вызовет диалоговое окно (возможно, вы могли бы попробовать неизвестный тип аутентификации, но я предполагаю, что это не будет работать надежно)
Существует большое количество кодов состояния серии 400 (https://httpstatuses.com/ ) - почему бы не использовать другой? 403, казалось бы, идеально описывает вашу потребность.
Вы не можете сделать это, отправив только ответ 401 Unauthorized (как уже указывал @davidgo). Однако вы не можете просто отправить вместо этого еще один статус 4xx; вам нужно и то, и другое.
Вам потребуется базовая аутентификация HTTP (т. Е. Потенциальный ответ «401 неавторизован»), когда Authorization
Заголовок HTTP-запроса отправляется из вашего программного обеспечения, но отвечает 403 Запрещено, если аутентификация не была предпринята при первоначальном запросе (то есть запрос браузера по умолчанию).
В Apache 2.4 вы можете использовать выражения Apache, чтобы сделать это условным ...
# Check if "Authorization: Basic ..." HTTP request header has been sent
<If "%{HTTP:Authorization} =~ /^Basic\s./">
AuthType Basic
AuthName "Private Area"
AuthUserFile "/home/user/.htpasswds/secret"
Require valid-user
</If>
<Else>
# 403 Forbidden all requests that have not sent an "Authorization" header
Require all denied
</Else>
При предоставлении программного обеспечения отправляются правильные учетные данные в Authorization
заголовок, то ему должен быть разрешен доступ. Если ваше программное обеспечение должно отправлять неправильно учетные данные, то будет возвращен ожидаемый ответ 401 Неавторизованный. В противном случае любой запрос, который не отправляет Authorization
заголовок просто получит сообщение 403 Forbidden и без запроса пароля.