comparison src/http/ngx_http_special_response.c @ 487:f2c6a7373274 NGINX_0_7_51

nginx 0.7.51 *) Feature: the "try_files" directive supports a response code in the fallback parameter. *) Feature: now any response code can be used in the "return" directive. *) Bugfix: the "error_page" directive made an external redirect without query string; the bug had appeared in 0.7.44. *) Bugfix: if servers listened on several defined explicitly addresses, then virtual servers might not work; the bug had appeared in 0.7.39.
author Igor Sysoev <http://sysoev.ru>
date Sun, 12 Apr 2009 00:00:00 +0400
parents c8cfb6c462ef
children ed5e10fb40fc
comparison
equal deleted inserted replaced
486:ba2ea8c4d60f 487:f2c6a7373274
273 273
274 static ngx_str_t ngx_http_error_pages[] = { 274 static ngx_str_t ngx_http_error_pages[] = {
275 275
276 ngx_null_string, /* 201, 204 */ 276 ngx_null_string, /* 201, 204 */
277 277
278 #define NGX_HTTP_LEVEL_200 1 278 #define NGX_HTTP_LAST_LEVEL_200 202
279 #define NGX_HTTP_LEVEL_200 (NGX_HTTP_LAST_LEVEL_200 - 201)
279 280
280 /* ngx_null_string, */ /* 300 */ 281 /* ngx_null_string, */ /* 300 */
281 ngx_string(ngx_http_error_301_page), 282 ngx_string(ngx_http_error_301_page),
282 ngx_string(ngx_http_error_302_page), 283 ngx_string(ngx_http_error_302_page),
283 ngx_null_string, /* 303 */ 284 ngx_null_string, /* 303 */
284 285
285 #define NGX_HTTP_LEVEL_300 3 286 #define NGX_HTTP_LAST_LEVEL_300 304
287 #define NGX_HTTP_LEVEL_300 (NGX_HTTP_LAST_LEVEL_300 - 301)
286 288
287 ngx_string(ngx_http_error_400_page), 289 ngx_string(ngx_http_error_400_page),
288 ngx_string(ngx_http_error_401_page), 290 ngx_string(ngx_http_error_401_page),
289 ngx_string(ngx_http_error_402_page), 291 ngx_string(ngx_http_error_402_page),
290 ngx_string(ngx_http_error_403_page), 292 ngx_string(ngx_http_error_403_page),
300 ngx_string(ngx_http_error_413_page), 302 ngx_string(ngx_http_error_413_page),
301 ngx_string(ngx_http_error_414_page), 303 ngx_string(ngx_http_error_414_page),
302 ngx_string(ngx_http_error_415_page), 304 ngx_string(ngx_http_error_415_page),
303 ngx_string(ngx_http_error_416_page), 305 ngx_string(ngx_http_error_416_page),
304 306
305 #define NGX_HTTP_LEVEL_400 17 307 #define NGX_HTTP_LAST_LEVEL_400 417
308 #define NGX_HTTP_LEVEL_400 (NGX_HTTP_LAST_LEVEL_400 - 400)
306 309
307 ngx_string(ngx_http_error_495_page), /* 495, https certificate error */ 310 ngx_string(ngx_http_error_495_page), /* 495, https certificate error */
308 ngx_string(ngx_http_error_496_page), /* 496, https no certificate */ 311 ngx_string(ngx_http_error_496_page), /* 496, https no certificate */
309 ngx_string(ngx_http_error_497_page), /* 497, http to https */ 312 ngx_string(ngx_http_error_497_page), /* 497, http to https */
310 ngx_string(ngx_http_error_404_page), /* 498, canceled */ 313 ngx_string(ngx_http_error_404_page), /* 498, canceled */
316 ngx_string(ngx_http_error_503_page), 319 ngx_string(ngx_http_error_503_page),
317 ngx_string(ngx_http_error_504_page), 320 ngx_string(ngx_http_error_504_page),
318 ngx_null_string, /* 505 */ 321 ngx_null_string, /* 505 */
319 ngx_null_string, /* 506 */ 322 ngx_null_string, /* 506 */
320 ngx_string(ngx_http_error_507_page) 323 ngx_string(ngx_http_error_507_page)
324
325 #define NGX_HTTP_LAST_LEVEL_500 508
326
321 }; 327 };
322 328
323 329
324 static ngx_str_t ngx_http_get_name = { 3, (u_char *) "GET " }; 330 static ngx_str_t ngx_http_get_name = { 3, (u_char *) "GET " };
325 331
400 406
401 } else if (error == NGX_HTTP_NO_CONTENT) { 407 } else if (error == NGX_HTTP_NO_CONTENT) {
402 /* 204 */ 408 /* 204 */
403 err = 0; 409 err = 0;
404 410
405 } else if (error < NGX_HTTP_BAD_REQUEST) { 411 } else if (error >= NGX_HTTP_MOVED_PERMANENTLY
412 && error < NGX_HTTP_LAST_LEVEL_300)
413 {
406 /* 3XX */ 414 /* 3XX */
407 err = error - NGX_HTTP_MOVED_PERMANENTLY + NGX_HTTP_LEVEL_200; 415 err = error - NGX_HTTP_MOVED_PERMANENTLY + NGX_HTTP_LEVEL_200;
408 416
409 } else if (error < NGX_HTTP_OWN_CODES) { 417 } else if (error >= NGX_HTTP_BAD_REQUEST
418 && error < NGX_HTTP_LAST_LEVEL_400)
419 {
410 /* 4XX */ 420 /* 4XX */
411 err = error - NGX_HTTP_BAD_REQUEST + NGX_HTTP_LEVEL_200 421 err = error - NGX_HTTP_BAD_REQUEST + NGX_HTTP_LEVEL_200
412 + NGX_HTTP_LEVEL_300; 422 + NGX_HTTP_LEVEL_300;
413 423
414 } else { 424 } else if (error >= NGX_HTTP_OWN_CODES
425 && error < NGX_HTTP_LAST_LEVEL_500)
426 {
415 /* 49X, 5XX */ 427 /* 49X, 5XX */
416 err = error - NGX_HTTP_OWN_CODES + NGX_HTTP_LEVEL_200 428 err = error - NGX_HTTP_OWN_CODES + NGX_HTTP_LEVEL_200
417 + NGX_HTTP_LEVEL_300 429 + NGX_HTTP_LEVEL_300
418 + NGX_HTTP_LEVEL_400; 430 + NGX_HTTP_LEVEL_400;
419 switch (error) { 431 switch (error) {
421 case NGX_HTTPS_CERT_ERROR: 433 case NGX_HTTPS_CERT_ERROR:
422 case NGX_HTTPS_NO_CERT: 434 case NGX_HTTPS_NO_CERT:
423 r->err_status = NGX_HTTP_BAD_REQUEST; 435 r->err_status = NGX_HTTP_BAD_REQUEST;
424 break; 436 break;
425 } 437 }
438
439 } else {
440 /* unknown code, zero body */
441 err = 0;
426 } 442 }
427 443
428 return ngx_http_send_special_response(r, clcf, err); 444 return ngx_http_send_special_response(r, clcf, err);
429 } 445 }
430 446
449 465
450 if (ngx_http_complex_value(r, &err_page->value, &uri) != NGX_OK) { 466 if (ngx_http_complex_value(r, &err_page->value, &uri) != NGX_OK) {
451 return NGX_ERROR; 467 return NGX_ERROR;
452 } 468 }
453 469
454 if (err_page->value.lengths) {
455 ngx_http_split_args(r, &uri, &args);
456
457 } else {
458 args = err_page->args;
459 }
460
461 if (uri.data[0] == '/') { 470 if (uri.data[0] == '/') {
471
472 if (err_page->value.lengths) {
473 ngx_http_split_args(r, &uri, &args);
474
475 } else {
476 args = err_page->args;
477 }
462 478
463 if (r->method != NGX_HTTP_HEAD) { 479 if (r->method != NGX_HTTP_HEAD) {
464 r->method = NGX_HTTP_GET; 480 r->method = NGX_HTTP_GET;
465 r->method_name = ngx_http_get_name; 481 r->method_name = ngx_http_get_name;
466 } 482 }