Я хочу добавить элементы управления доступом ко всему виртуальному хосту на обратном прокси-сервере. Для этого я использую аутентификацию подзапроса nginx. Ожидаемое взаимодействие заключается в том, что пользователь либо получит сообщение об ошибке со ссылкой на страницу входа, либо страница входа будет отображаться по запрошенному URL-адресу. По завершении процесса входа в систему у пользователя должен быть какой-то механизм для навигации/перезагрузки первоначально запрошенного URL-адреса. На самом обратном прокси-сервере (т.е. нет PHP) нет возможности сценариев, что ограничивает возможности захвата и распространения исходного URL-адреса в процессе аутентификации.
Мое ожидание: если запрос не проходит аутентификацию (т. http://authprovider.example.com:8081/gateway/index.php возвращает 401) Я хочу, чтобы определенный контент возвращался по запрошенному URL-адресу без перенаправления и со статусом 4xx.
сервер {
слушать 80;
имя_сервера www.example.com;
корень /var/www/html;
error_page 401 iprestricted.html;
## Это обеспечивает обратную связь с пользователем, когда запрос запрещен
## (включая ссылку для входа)
# местоположение /iprestricted.html {
# try_files $uri $uri/ =404;
# }
# Это реализует проверку подзапроса....
местоположение / ограничено {
внутренний;
proxy_pass http://authprovider.example.com:8081/gateway/index.php;
proxy_pass_request_body выключен;
proxy_set_header Длина содержимого "";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Исходный URI $request_uri;
}
место расположения / {
auth_request/ограниченный;
proxy_pass http://localwebserver/;
}
}
Однако:
Если расположение /iprestricted.html{...}
закомментирован, я получаю цикл перенаправления
в http://www.example.com
Если он не закомментирован, то любые запросы получают ответ 302 с Location /iprestricted.html, который возвращает код состояния 200.
Как реализовать аутентификацию подзапроса без перенаправления?
Есть ли другой способ захватить исходный URL-адрес и передать его на шаг аутентификации, используя только конфигурацию nginx?
я пробовал добавить add_header WWW-Authenticate "Basic realm=bipdevtest";
в каждом из указанных выше мест, но это не было отправлено обратно в ответах HTTP.