Я хочу добавить контроль доступа ко всему 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 ответах.
Всегда рекомендуется RTFM
Nginx будет передавать заголовок WWW-Authenticate, если он будет возвращен провайдером auth_request (http://authprovider.example.com:8081/gateway/index .php выше).
Однако я оставлю вопрос открытым, так как я сбит с толку/обеспокоен пользовательской страницей ошибки, которая приводит к перенаправлению 302, за которым следует ответ 200.