diff options
author | Igor Sysoev <igor@sysoev.ru> | 2006-08-14 15:09:38 +0000 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2006-08-14 15:09:38 +0000 |
commit | 08e63d46ded2584fea1e7547fa2e958ab978f42f (patch) | |
tree | 61903390323a199b0cd22c667f24376f5ecaf4ac /src/http/ngx_http_special_response.c | |
parent | 4641f171ccfc7e0936646c65ba13515e82299ce0 (diff) | |
download | nginx-release-0.3.58.tar.gz nginx-release-0.3.58.zip |
nginx-0.3.58-RELEASE importrelease-0.3.58
*) Feature: the "error_page" directive supports the variables.
*) Change: now the procfs interface instead of sysctl is used on Linux.
*) Change: now the "Content-Type" header line is inherited from first
response when the "X-Accel-Redirect" was used.
*) Bugfix: the "error_page" directive did not redirect the 413 error.
*) Bugfix: the trailing "?" did not remove old arguments if no new
arguments were added to a rewritten URI.
*) Bugfix: nginx could not run on 64-bit FreeBSD 7.0-CURRENT.
Diffstat (limited to 'src/http/ngx_http_special_response.c')
-rw-r--r-- | src/http/ngx_http_special_response.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/src/http/ngx_http_special_response.c b/src/http/ngx_http_special_response.c index 734ad6947..dfff64107 100644 --- a/src/http/ngx_http_special_response.c +++ b/src/http/ngx_http_special_response.c @@ -295,8 +295,9 @@ ngx_int_t ngx_http_special_response_handler(ngx_http_request_t *r, ngx_int_t error) { ngx_int_t rc; - ngx_uint_t i, err, msie_padding; ngx_buf_t *b; + ngx_str_t *uri; + ngx_uint_t i, err, msie_padding; ngx_chain_t *out, *cl; ngx_http_err_page_t *err_page; ngx_http_core_loc_conf_t *clcf; @@ -349,9 +350,20 @@ ngx_http_special_response_handler(ngx_http_request_t *r, ngx_int_t error) r->method = NGX_HTTP_GET; - if (err_page[i].uri.data[0] == '/') { - return ngx_http_internal_redirect(r, &err_page[i].uri, - NULL); + uri = &err_page[i].uri; + + if (err_page[i].uri_lengths) { + if (ngx_http_script_run(r, uri, + err_page[i].uri_lengths->elts, 0, + err_page[i].uri_values->elts) + == NULL) + { + return NGX_ERROR; + } + } + + if (uri->data[0] == '/') { + return ngx_http_internal_redirect(r, uri, NULL); } r->headers_out.location = @@ -364,10 +376,10 @@ ngx_http_special_response_handler(ngx_http_request_t *r, ngx_int_t error) r->headers_out.location->hash = 1; r->headers_out.location->key.len = sizeof("Location") - 1; r->headers_out.location->key.data = (u_char *) "Location"; - r->headers_out.location->value = err_page[i].uri; + r->headers_out.location->value = *uri; } else { - error = NGX_HTTP_INTERNAL_SERVER_ERROR; + return NGX_ERROR; } } } |