Tengo un proxy inverso NGINX que también sirve contenido estático en / con la siguiente configuración
location / { auth_request /authn; proxy_intercept_errors on; recursive_error_pages on; error_page 301 302 303 307 308 = @handle_redirect; gzip_static on; index index.html; root /usr/share/nginx/html; try_files $uri $uri/ @index; } location /authn { set $target http://gateway:8030/authn; proxy_pass http://gateway:8030/authn; proxy_pass_request_body off; proxy_set_header Content-Length ""; proxy_set_header X-Original-URI $request_uri; proxy_pass_request_headers on; proxy_intercept_errors on; recursive_error_pages on; error_page 301 302 303 307 308 @handle_redirect; } location @handle_redirect { proxy_set_header Host $host:$server_port; set $redirect_url $upstream_http_location; proxy_pass $redirect_url; }El objetivo es verificar que el usuario esté autenticado por subsolicitud al punto final /authn, que devolverá 302 y el encabezado de ubicación si el usuario no lo está. Pero el cliente obtiene 500 de NGINX con un registro de errores como
auth request unexpected status: 500 while sending to clientTambién tengo un punto final /root que pasa poxy directamente a la puerta de enlace /authn que redirige correctamente a la página de inicio de sesión y autentica al cliente. En lugar de manejar redireccionamientos en subsolicitudes, probé solicitudes de paso de proxy a este punto final con la configuración
location /root { set $target http://top-gateway:8030/authn; proxy_pass http://top-gateway:8030/authn; } location /authn { ... error_page 301 302 303 307 308 /root;Pero en este caso me sale 500 y
auth request unexpected status: 302 while sending to clienten NGINX error.log
¿Por qué NGINX no maneja las redirecciones correctamente con esta configuración y cómo resolverlo correctamente?
Tal vez esto sea útil para usted para saber por qué falla, tal vez llegué tarde, pero encontré este hilo para hacer algo similar.
El enlace muestra una conversación entre un desarrollador de Nginx y un usuario que estaba motivado para escribir un parche. Parece que Nginx solo admite códigos 2xx y 4xx para auth_request. Pero podría hacer algo como esto si controla la aplicación como se muestra en ese enlace.
location / { auth_request /auth; auth_request_set $auth_redirect $upstream_http_location; error_page 401 = /auth_redirect; } location /auth { proxy_pass http://auth_backend; ... } location /auth_redirect { return 302 $auth_redirect; }Además, me resultó útil leer esto (no es lo mismo, pero es una pista para algunas ideas):
¿Cómo realizo llamadas de servicio web dentro de nginx?
Este enlace muestra una introducción simple (que puede encontrar en la documentación) sobre auth_request_set.
auth_request_set $x_upstreamhost $upstream_http_x_upstreamhost;Además, aquí hay un nivel profundo de la implementación del código de auth_request.
https://www.nginx.com/resources/wiki/extending/examples/auth_request/
Este enlace muestra un desglose del código de la implementación de auth_request. No puedo incluir eso aquí.
Salud,