Possible bug with "proxy_intercept_errors on; " + "error_page 301 302"?

Maxim Dounin mdounin at mdounin.ru
Sat Jul 1 00:43:57 UTC 2023


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/


More information about the nginx mailing list