Possible bug with "proxy_intercept_errors on; " + "error_page

M
  • 1 Jul '23
Hello!

On Fri, Jun 30, 2023 at 01:24:18PM -0300, Fabiano Furtado Pessoa Coelho wrote:

> Hello Maxim...
> 
> On Thu, Jun 29, 2023 at 7:00 PM Maxim Dounin <mdounin at mdounin.ru> wrote:
> >
> > Hello!
> >
> > On Thu, Jun 29, 2023 at 04:29:39PM -0300, Fabiano Furtado Pessoa Coelho wrote:
> >
> > > Hi...
> ...
> > > "proxy_intercept_errors on;"?
> >
> > The "proxy_intercept_errors" handling does not copy any response
> > headers from the original response (the only exception is
> > WWW-Authenticate for 403 responses).
> >
> > If you want nginx to copy some headers, consider doing it yourself
> > with the $upstream_http_* variables and the add_header directive.
> > Something like this should work:
> >
> >     location /30x.html {
> >         add_header Location $upstream_http_location;
> >         ...
> >     }
> >
> > Note though that you'll have to manually rewrite location if
> > needed (as proxy_redirect handling won't be used).
> 
> Your approach worked fine for me! Thanks for the help.
> 
> Horever, without this "add_header" modification and with
> "proxy_intercept_errors on;", I've two situations:
> * without "error_page 301 302 /30x.html;" directive configured: I
> receive the HTTP "location" header from my NGINX;
> * with "error_page 301 302 /30x.html;" directive configured: I don't
> receive the HTTP "location" header from my NGINX;
> 
> If "proxy_intercept_errors" handling does not copy any response
> headers from the original response, why is this HTTP "location" header
> present with "error_page 301 302 /30x.html;" directive configured in
> my system?
> 
> I really don't understand why it happens.

The "proxy_intercept_errors" directive only works for error 
responses for which you have an error_page explicitly configured.  
That is:

- If you don't have an error_page configured for the particular 
  response code, nginx returns the original response as obtained 
  from the upstream server, with all the response headers, much like 
  it does with "proxy_intercept_errors off;".

- If you do have an error_page configured, nginx instead 
  intercepts the error as per "proxy_intercept_errors on;", and 
  returns the error page to the client.  This response does not contain
  headers from the original response.

This seems to be exactly what you are seeing (assuming "with" in 
your final question is a typo, and you mean "without" instead).  
Hope this helps.

-- 
Maxim Dounin
http://mdounin.ru/
F
  • 1 Jul '23
Thanks.

On Fri, Jun 30, 2023, 9:44 PM Maxim Dounin <mdounin at mdounin.ru> wrote:

> Hello!
>
> On Fri, Jun 30, 2023 at 01:24:18PM -0300, Fabiano Furtado Pessoa Coelho
> wrote:
>
> > Hello Maxim...
> >
> > On Thu, Jun 29, 2023 at 7:00 PM Maxim Dounin <mdounin at mdounin.ru> wrote:
> > >
> > > Hello!
> > >
> > > On Thu, Jun 29, 2023 at 04:29:39PM -0300, Fabiano Furtado Pessoa
> Coelho wrote:
> > >
> > > > Hi...
> > ...
> > > > "proxy_intercept_errors on;"?
> > >
> > > The "proxy_intercept_errors" handling does not copy any response
> > > headers from the original response (the only exception is
> > > WWW-Authenticate for 403 responses).
> > >
> > > If you want nginx to copy some headers, consider doing it yourself
> > > with the $upstream_http_* variables and the add_header directive.
> > > Something like this should work:
> > >
> > >     location /30x.html {
> > >         add_header Location $upstream_http_location;
> > >         ...
> > >     }
> > >
> > > Note though that you'll have to manually rewrite location if
> > > needed (as proxy_redirect handling won't be used).
> >
> > Your approach worked fine for me! Thanks for the help.
> >
> > Horever, without this "add_header" modification and with
> > "proxy_intercept_errors on;", I've two situations:
> > * without "error_page 301 302 /30x.html;" directive configured: I
> > receive the HTTP "location" header from my NGINX;
> > * with "error_page 301 302 /30x.html;" directive configured: I don't
> > receive the HTTP "location" header from my NGINX;
> >
> > If "proxy_intercept_errors" handling does not copy any response
> > headers from the original response, why is this HTTP "location" header
> > present with "error_page 301 302 /30x.html;" directive configured in
> > my system?
> >
> > I really don't understand why it happens.
>
> The "proxy_intercept_errors" directive only works for error
> responses for which you have an error_page explicitly configured.
> That is:
>
> - If you don't have an error_page configured for the particular
>   response code, nginx returns the original response as obtained
>   from the upstream server, with all the response headers, much like
>   it does with "proxy_intercept_errors off;".
>
> - If you do have an error_page configured, nginx instead
>   intercepts the error as per "proxy_intercept_errors on;", and
>   returns the error page to the client.  This response does not contain
>   headers from the original response.
>
> This seems to be exactly what you are seeing (assuming "with" in
> your final question is a typo, and you mean "without" instead).
> Hope this helps.
>
> --
> Maxim Dounin
> http://mdounin.ru/
> _______________________________________________
> nginx mailing list
> nginx at nginx.org
> https://mailman.nginx.org/mailman/listinfo/nginx
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.nginx.org/pipermail/nginx/attachments/20230630/e03183db/attachment.htm>