Serving default error pages with 'proxy_intercept_errors on'

Maxim Dounin mdounin at mdounin.ru
Sat Dec 28 12:19:43 UTC 2013


Hello!

On Fri, Dec 27, 2013 at 03:47:51PM -0500, Maxim Khitrov wrote:

> Hello,
> 
> I'm running nginx v1.4.1 on OpenBSD 5.4 and I'd like to use
> 'proxy_intercept_errors on' directive without providing my own error
> pages. In other words, instead of forwarding page content from the
> backend server, just use the error pages that nginx generates by
> default.
> 
> This isn't supported normally, however the following configuration
> seems to achieve the desired result (though you have to list the error
> codes explicitly):
> 
> error_page 403 404 ... @error;
> location @error { return 444; }
> 
> I didn't actually know what this would do until I tried it. I assume
> that when a matching error code is received from the backend server,
> nginx closes the proxy connection without reading the body and creates
> a new internal request to @error, which is immediately closed without
> a response. Thus, there is no body to send to the client, so it falls
> back to the default behavior.

Not really.

What you see works because currently "return <4xx>" doesn't 
override error code previously set, thus for 404 error code 
originally returned by a proxied server

    location @error { return 4xx; }

is effectively equivalent to 

    location @error { return 404; }

which is documented to return "status code of the last occurred 
error", see http://nginx.org/r/error_page.

> The question is whether this behavior is an accident and may change in
> a future version, or if it's an acceptable way of intercepting errors
> without providing custom error pages?

I wouldn't recommend relaying on this.  Current behaviour of 
"return", which effectively uses previous error code set, is 
somewhat questionable, and may change in the future.

-- 
Maxim Dounin
http://nginx.org/



More information about the nginx mailing list