Dienstag, 2. November 2021 / 18:13
Nginx Fehlerseite mehrsprachig mit SSI
Abgelegt unter
Linux
—
von
Deborah White
Gastbeitrag von Deborah White
Disclaimer: Nachmachen auf eigene Gefahr!
Mehrsprachige Fehlerseiten, je nach Browser-Sprache mit Fallbacksprache Englisch, beispielhaft in Deutsch und Englisch. Das ganze wurde gestest auf einem Debian-System mit buster.
- Wir benötigen zunächst eine globale Konfiguration mit den Maps der Statustexte ('/etc/nginx/conf.d/error_text_maps.conf'). Diese muss mit direkt unter 'http' inkludiert werden. In Debian-basierten Systemen ist dies bereits vorkonfiguriert:
include /etc/nginx/conf.d/*.conf;
- Die Konfiguration der Fehlerseiten für den jeweiligen Host ('/etc/nginx/snippets/error_pages.conf'). Diese muss unter jeder gewünscht Host-Konfiguration unter 'server' inkludiert werden:
include /etc/nginx/snippets/error_pages.conf;
- Schließlich benötigen wir noch die HTML-Datei, um die Fehlerseite anzuzeigen ('/var/www/errordocs/error.html').
- Neustart
1. Globale Konfiguration mit den Maps der Statustexte
# /etc/nginx/conf.d/error_text_maps.conf map $http_accept_language $language { default en; ~de de; # here you can add more languages # ~fr fr; } map $status $default_status_text { 400 'Bad Request' ; 401 'Authorization Required'; 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 'Request-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 Temporarily 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 went wrong'; } map $status$language $status_text { default $default_status_text; 400de 'Ungültige Anforderung'; 401de 'Autorisation benötigt'; 403de 'Keine Berechtigung'; 404de 'Seite nicht gefunden'; 405de 'Methode nicht erlaubt'; 406de 'Nicht akzeptiert.'; 407de 'Proxy-Autorisation benötigt'; 412de 'Voraussetzung nicht erfüllt'; 414de 'URL zu lang'; 415de 'Nicht unterstützter Medientyp'; 500de 'Interner Serverfehler'; 501de 'Nicht implementiert'; 502de 'Gateway-Fehler'; 503de 'Service nicht verfügbar'; } map $status $default_status_message { 400 'Your browser sent a request that this server could not understand.'; 401 'This server could not verify that you are authorized to access the document requested. Either you supplied the wrong credentials (e.g., bad password), or your browser doesn\'t understand how to supply'; 403 'You do not have permission to access this document.'; 404 'The requested document was not found on this server.'; 405 'The HTTP verb used to access this page is not allowed.'; 406 'Client browser does not accept the MIME type of the requested page.'; 407 'You must be authenticated by a proxy server before the Web server can execute your request.'; 412 'The request was not completed due to preconditions that are set in the request header.'; 414 'The Web server is refusing to service the request because the requested URL address is too long.'; 415 'The Web server cannot service the request because the requested file is in a format that the server is configured not to download'; 500 'The server encountered an internal error or misconfiguration and was unable to complete your request.'; 501 'The page you are looking for cannot be displayed because a header value in the request does not match certain configuration settings on the Web server.'; 502 'Web server received an invalid response while acting as a gateway or proxy server.'; 503 'The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.'; } map $status$language $status_message { default $default_status_message; 400de 'Ungültige Anforderung", "Der Server konnte die Anfrage nicht beantworteten.'; 401de 'Der Webserver kann nicht feststellen, dass Sie eine Zugriffsberechtigung auf das angeforderte Dokument besitzen. Entweder haben Sie falsche Zugangsdaten eingegeben, oder Ihr Browser kann die angeforderten Zugangsdaten nicht bereitstellen.'; 403de 'Der Zugriff auf die gewünschten Daten ist nicht erlaubt.'; 404de 'Leider konnte die angeforderte Seite nicht auf unserem Server gefunden werden.'; 405de 'Die HTTP-Anforderung für dieses Dokument ist nicht erlaubt.'; 406de 'Ihr Browser akzeptiert den MIME-Typ des angeforderten Dokuments nicht.'; 407de 'Sie müssen Sich am Proxy-Server authentifizieren, bevor der Webserver Ihre Anforderung bearbeiten kann.'; 412de 'Die Anfrage konnte nicht vollständig bearbeitet werden, weil mindestens eine Voraussetzung nicht erfüllt ist.'; 414de 'Der Webserver kann die Anfrage nicht bearbeiten, weil die Anfrage-URL zu lang ist.'; 415de 'Der Webserver kann die Anfrage nicht bearbeiten, weil das angeforderte Dokumenten ein unbekanntes Format hat'; 500de 'Es ist ein interner Serverfehler aufgetreten.'; 501de 'Die Anfrage enthält Anforderungen, die der Server nicht bearbeiten kann.'; 502de 'Bearbeitung der Anfrage an einen anderen Server fehlgeschlagen.'; 503de 'Der Service ist zur Zeit nicht verfügbar, bitte versuchen Sie es später noch einmal.'; }
2. Die Konfiguration der Fehlerseiten für den jeweiligen Host
# /etc/nginx/snippets/error_pages.conf: 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; # set to on in production ssi_silent_errors on; auth_basic off; root /var/www/errordocs; index error.html; }
3. Fehlerseite (Beispiel)
# /var/www/errordocs/error.html (Beispiel): <!--# set var="status_lang" value="$language" --><!--# if expr="$default_status_text = $status_text" --><!--# set var="status_lang" value="en" --><!--# endif --><html lang="<!--# echo var="status_lang" -->"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title><!--# echo var="status" default="" --> <!--# echo var="status_text" default="Something went wrong" --></title> <style> body, body * { font-family:sans-serif, Arial, Helvetica,serif; color: #444444; font-size: 11pt; } p { text-align: justify; } h3 { font-size: 14pt; text-transform: uppercase; color: #CC0000; } a { color: #666666; } a:hover { color: #888888; } body { background-color: white; margin: 0.5em; padding:0.5em; } </style> </head> <body> <div class="infoblock"> <h3><!--# echo var="status" default="" --> <!--# echo var="status_text" default="Something went wrong" --></h3> <!--# set var="msg_lang" value="$language" --><!--# if expr="$default_status_message = $status_message" --><!--# set var="msg_lang" value="en" --><!--# endif --> <!--# if expr="$status_message" --><p lang="<!--# echo var="msg_lang" -->"><!--# echo var="status_message" --></p><!--# endif --></div> <hr /> Domain <!--# echo var="http_host" default="(unknown)" --> </body> </html>
4. Neustart
# debian service nginx configtest && service nginx reload