Я хочу добавить элементы управления доступом ко всему vhost на обратном прокси-сервере. Для этого я использую аутентификацию подзапроса nginx. Ожидаемое взаимодействие заключается в том, что пользователь либо получит сообщение об ошибке со ссылкой на страницу входа, либо страница входа будет отображена по запрошенному URL. По завершении процесса входа должен быть какой-то механизм, позволяющий пользователю перейти/перезагрузить изначально запрошенный URL. На самом обратном прокси-сервере нет возможности создания скриптов (т. е. нет PHP), что ограничивает возможности захвата и распространения исходного URL через процесс аутентификации.
Мои ожидания: если запрос не проходит аутентификацию (т.е.http://authprovider.example.com:8081/gateway/index.phpвозвращает 401) Я хочу, чтобы определенный контент возвращался по запрошенному URL-адресу без перенаправления и со статусом 4xx.
server {
listen 80;
server_name www.example.com;
root /var/www/html;
error_page 401 iprestricted.html;
## This provides feedback to the user when request is disallowed
## (including a link to login)
# location /iprestricted.html {
# try_files $uri $uri/ =404;
# }
# This implements the sub-request check....
location /restricted {
internal;
proxy_pass http://authprovider.example.com:8081/gateway/index.php ;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Original-URI $request_uri;
}
location / {
auth_request /restricted;
proxy_pass http://localwebserver/;
}
}
Однако:
Если location /iprestricted.html{...}
закомментировано, я получаю цикл перенаправления наhttp://www.example.com
Если он не закомментирован, то на все запросы будет возвращаться ответ 302 с Location /iprestricted.html, который возвращает код статуса 200.
Как реализовать аутентификацию подзапросов без перенаправлений?
Есть ли другой способ захватить исходный URL-адрес и передать его на этап аутентификации, используя только конфигурацию nginx?
Я попробовал добавить add_header WWW-Authenticate "Basic realm=bipdevtest";
оба указанных выше местоположения, но они не были отправлены в HTTP-ответах.
решение1
Всегда хорошая идеяРТФМ
Nginx будет ретранслировать заголовок WWW-Authenticate, если он возвращен поставщиком auth_request (http://authprovider.example.com:8081/gateway/index.phpвыше).
Однако я оставлю этот вопрос открытым, поскольку меня смущает/обеспокоена пользовательская страница с ошибкой, приводящая к перенаправлению 302 с последующим ответом 200.