Problem with error_handler (redirect loop?)
Maxim Dounin
mdounin at mdounin.ru
Tue Jul 6 00:19:58 MSD 2010
Hello!
On Mon, Jul 05, 2010 at 03:48:21PM -0400, bkirkbri wrote:
> I'm running into a problem where requests that trigger an error_page
> handler get caught in a redirect loop and eventually fail with a 500
> response. It looks like this _may_ be related to our server_name being
> a regex with captures, as that is what nginx is doing right before the
> error output.
[...]
> server_name ~^(.)(.)(.).*$;
> set $host_1 $1;
> set $host_2 $2;
> set $host_3 $3;
You are using nonexitant enumerated captures here as they are
gone as soon as you execute another regexp while server rewrite
directives (including "set") are re-executed after internal
redirects.
General rule is: never use enumerated captures from server_name
regexp as long as you have other regexps in server block in
question. Or, better: never use enumerated captures from
server_name.
This particular problem with malloc(-2) should be fixed 0.8.*.
Also in 0.8.* you may use named captures in server_name instead of
enumerated, they will survive internal redirects.
For 0.7.* just avoid using captures in server_name. If you really
have to set something based on Host header - use
if ($http_host ~ "^(.)(.)(.).*$") {
set $host_1 $1;
set $host_2 $2;
set $host_3 $3;
}
at server level instead.
[...]
> recursive_error_pages on;
[...]
> error_page 500 502 503 /server_error.html;
And you switched off protection from recursive error pages, and
you have error_page defined for 500 Internal Server Error. There
is no surprise you see loop.
Maxim Dounin
More information about the nginx
mailing list