Skip to main content

Nginx Error Pages

To make life easier, Nginx allows for the error pages in a virtual host to not be in the webroot of said virtual host. This means that the error pages used across all the sites on my VPS (where they're not a CMS or equiv that has built in error pages) can be saved in one location. To take this one step further, Server Side Injection (SSI) can be used which allows for injecting the error code and the title of error into a single webpage - saving us having an error page for each error we'll come across!

Config for each VHost

Each virtual host needs the following config adding to it:

error_page 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 421 422 423 424 425 426 428 429 431 451 500 501 502 503 504 505 506 507 508 510 511 /error.html;

location = /error.html {
  ssi on;
  internal;
  auth_basic off;
  root [path_to_folder_containing_errror_page];
}

Mapping Status Codes to Errors

The following map needs to be added to the http directive (which is in the http block in the Nginx config file - on Nginx 1.18 this is /etc/nginx/nginx.conf).

map $status $status_text {
  400 'Bad Request';
  401 'Unauthorized';
  402 'Payment Required';
  403 'Forbidden';
  404 'Not Found';
  405 'Method Not Allowed';
  406 'Not Acceptable';
  407 'Proxy Authentication Required';
  408 'Request Timeout';
  409 'Conflict';
  410 'Gone';
  411 'Length Required';
  412 'Precondition Failed';
  413 'Payload Too Large';
  414 'URI Too Long';
  415 'Unsupported Media Type';
  416 'Range Not Satisfiable';
  417 'Expectation Failed';
  418 'I\'m a teapot';
  421 'Misdirected Request';
  422 'Unprocessable Entity';
  423 'Locked';
  424 'Failed Dependency';
  425 'Too Early';
  426 'Upgrade Required';
  428 'Precondition Required';
  429 'Too Many Requests';
  431 'Request Header Fields Too Large';
  451 'Unavailable For Legal Reasons';
  500 'Internal Server Error';
  501 'Not Implemented';
  502 'Bad Gateway';
  503 'Service Unavailable';
  504 'Gateway Timeout';
  505 'HTTP Version Not Supported';
  506 'Variant Also Negotiates';
  507 'Insufficient Storage';
  508 'Loop Detected';
  510 'Not Extended';
  511 'Network Authentication Required';
  default 'Something is wrong';
}

Using SSI

For the status code:

<!--# echo var="status" default="" -->

For the error message:

<!--# echo var="status_text" default="Something goes wrong" -->