34
static u_char ngx_http_msie_stub[] =
35
"<!-- The padding to disable MSIE's friendly error page -->" CRLF
36
"<!-- The padding to disable MSIE's friendly error page -->" CRLF
37
"<!-- The padding to disable MSIE's friendly error page -->" CRLF
38
"<!-- The padding to disable MSIE's friendly error page -->" CRLF
39
"<!-- The padding to disable MSIE's friendly error page -->" CRLF
40
"<!-- The padding to disable MSIE's friendly error page -->" CRLF
35
static u_char ngx_http_msie_padding[] =
36
"<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF
37
"<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF
38
"<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF
39
"<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF
40
"<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF
41
"<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF
276
303
ngx_null_string, /* 201, 204 */
278
#define NGX_HTTP_LEVEL_200 1
305
#define NGX_HTTP_LAST_2XX 202
306
#define NGX_HTTP_OFF_3XX (NGX_HTTP_LAST_2XX - 201)
280
308
/* ngx_null_string, */ /* 300 */
281
309
ngx_string(ngx_http_error_301_page),
282
310
ngx_string(ngx_http_error_302_page),
283
ngx_null_string, /* 303 */
311
ngx_string(ngx_http_error_303_page),
312
ngx_null_string, /* 304 */
313
ngx_null_string, /* 305 */
314
ngx_null_string, /* 306 */
315
ngx_string(ngx_http_error_307_page),
285
#define NGX_HTTP_LEVEL_300 3
317
#define NGX_HTTP_LAST_3XX 308
318
#define NGX_HTTP_OFF_4XX (NGX_HTTP_LAST_3XX - 301 + NGX_HTTP_OFF_3XX)
287
320
ngx_string(ngx_http_error_400_page),
288
321
ngx_string(ngx_http_error_401_page),
302
335
ngx_string(ngx_http_error_415_page),
303
336
ngx_string(ngx_http_error_416_page),
305
#define NGX_HTTP_LEVEL_400 17
338
#define NGX_HTTP_LAST_4XX 417
339
#define NGX_HTTP_OFF_5XX (NGX_HTTP_LAST_4XX - 400 + NGX_HTTP_OFF_4XX)
341
ngx_string(ngx_http_error_494_page), /* 494, request header too large */
307
342
ngx_string(ngx_http_error_495_page), /* 495, https certificate error */
308
343
ngx_string(ngx_http_error_496_page), /* 496, https no certificate */
309
344
ngx_string(ngx_http_error_497_page), /* 497, http to https */
331
369
ngx_http_err_page_t *err_page;
332
370
ngx_http_core_loc_conf_t *clcf;
334
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
335
"http special response: %d, \"%V\"", error, &r->uri);
372
ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
373
"http special response: %d, \"%V?%V\"",
374
error, &r->uri, &r->args);
337
376
r->err_status = error;
339
if (r->keepalive != 0) {
341
380
case NGX_HTTP_BAD_REQUEST:
342
381
case NGX_HTTP_REQUEST_ENTITY_TOO_LARGE:
393
435
if (error == NGX_HTTP_CREATED) {
398
439
} else if (error == NGX_HTTP_NO_CONTENT) {
402
} else if (error < NGX_HTTP_BAD_REQUEST) {
443
} else if (error >= NGX_HTTP_MOVED_PERMANENTLY
444
&& error < NGX_HTTP_LAST_3XX)
404
err = error - NGX_HTTP_MOVED_PERMANENTLY + NGX_HTTP_LEVEL_200;
447
err = error - NGX_HTTP_MOVED_PERMANENTLY + NGX_HTTP_OFF_3XX;
406
} else if (error < NGX_HTTP_OWN_CODES) {
449
} else if (error >= NGX_HTTP_BAD_REQUEST
450
&& error < NGX_HTTP_LAST_4XX)
408
err = error - NGX_HTTP_BAD_REQUEST + NGX_HTTP_LEVEL_200
409
+ NGX_HTTP_LEVEL_300;
453
err = error - NGX_HTTP_BAD_REQUEST + NGX_HTTP_OFF_4XX;
455
} else if (error >= NGX_HTTP_NGINX_CODES
456
&& error < NGX_HTTP_LAST_5XX)
413
err = error - NGX_HTTP_OWN_CODES + NGX_HTTP_LEVEL_200
415
+ NGX_HTTP_LEVEL_400;
459
err = error - NGX_HTTP_NGINX_CODES + NGX_HTTP_OFF_5XX;
417
461
case NGX_HTTP_TO_HTTPS:
418
462
case NGX_HTTPS_CERT_ERROR:
419
463
case NGX_HTTPS_NO_CERT:
464
case NGX_HTTP_REQUEST_HEADER_TOO_LARGE:
420
465
r->err_status = NGX_HTTP_BAD_REQUEST;
470
/* unknown code, zero body */
425
474
return ngx_http_send_special_response(r, clcf, err);
479
ngx_http_filter_finalize_request(ngx_http_request_t *r, ngx_module_t *m,
485
ngx_http_clean_header(r);
490
ctx = r->ctx[m->ctx_index];
493
/* clear the modules contexts */
494
ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module);
497
r->ctx[m->ctx_index] = ctx;
500
r->filter_finalize = 1;
502
rc = ngx_http_special_response_handler(r, error);
504
/* NGX_ERROR resets any pending data */
519
ngx_http_clean_header(ngx_http_request_t *r)
521
ngx_memzero(&r->headers_out.status,
522
sizeof(ngx_http_headers_out_t)
523
- offsetof(ngx_http_headers_out_t, status));
525
r->headers_out.headers.part.nelts = 0;
526
r->headers_out.headers.part.next = NULL;
527
r->headers_out.headers.last = &r->headers_out.headers.part;
529
r->headers_out.content_length_n = -1;
530
r->headers_out.last_modified_time = -1;
430
535
ngx_http_send_error_page(ngx_http_request_t *r, ngx_http_err_page_t *err_page)
432
u_char ch, *p, *last;
433
ngx_str_t *uri, *args, u, a;
434
539
ngx_table_elt_t *location;
435
540
ngx_http_core_loc_conf_t *clcf;
437
r->err_status = err_page->overwrite;
441
if (err_page->uri_lengths) {
442
if (ngx_http_script_run(r, &u, err_page->uri_lengths->elts, 0,
443
err_page->uri_values->elts)
466
u.len = p - 1 - u.data;
486
uri = &err_page->uri;
487
args = &err_page->args;
490
if (uri->data[0] == '/') {
542
overwrite = err_page->overwrite;
544
if (overwrite && overwrite != NGX_HTTP_OK) {
545
r->expect_tested = 1;
548
if (overwrite >= 0) {
549
r->err_status = overwrite;
552
if (ngx_http_complex_value(r, &err_page->value, &uri) != NGX_OK) {
556
if (uri.data[0] == '/') {
558
if (err_page->value.lengths) {
559
ngx_http_split_args(r, &uri, &args);
562
args = err_page->args;
492
565
if (r->method != NGX_HTTP_HEAD) {
493
566
r->method = NGX_HTTP_GET;
494
567
r->method_name = ngx_http_get_name;
497
return ngx_http_internal_redirect(r, uri, args);
570
return ngx_http_internal_redirect(r, &uri, &args);
500
if (uri->data[0] == '@') {
501
return ngx_http_named_location(r, uri);
573
if (uri.data[0] == '@') {
574
return ngx_http_named_location(r, &uri);
504
577
location = ngx_list_push(&r->headers_out.headers);
551
631
msie_padding = 0;
554
if (ngx_http_error_pages[err].len) {
555
r->headers_out.content_length_n = ngx_http_error_pages[err].len
557
if (clcf->msie_padding
558
&& r->headers_in.msie
559
&& r->http_version >= NGX_HTTP_VERSION_10
560
&& err >= NGX_HTTP_LEVEL_300)
562
r->headers_out.content_length_n +=
563
sizeof(ngx_http_msie_stub) - 1;
567
r->headers_out.content_type_len = sizeof("text/html") - 1;
568
r->headers_out.content_type.len = sizeof("text/html") - 1;
569
r->headers_out.content_type.data = (u_char *) "text/html";
572
r->headers_out.content_length_n = -1;
633
if (ngx_http_error_pages[err].len) {
634
r->headers_out.content_length_n = ngx_http_error_pages[err].len + len;
635
if (clcf->msie_padding
636
&& (r->headers_in.msie || r->headers_in.chrome)
637
&& r->http_version >= NGX_HTTP_VERSION_10
638
&& err >= NGX_HTTP_OFF_4XX)
640
r->headers_out.content_length_n +=
641
sizeof(ngx_http_msie_padding) - 1;
645
r->headers_out.content_type_len = sizeof("text/html") - 1;
646
ngx_str_set(&r->headers_out.content_type, "text/html");
647
r->headers_out.content_type_lowcase = NULL;
576
650
r->headers_out.content_length_n = 0;
580
653
if (r->headers_out.content_length) {