El 404 por defecto es una página en blanco con el nombre y la versión del servidor encima. Pierde al visitante y le entrega a cualquiera que escanee tu sitio un número de versión exacto para buscar. Tu propia página mantiene a la gente en el sitio y no dice nada que no deba.

Nginx

error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;

location = /404.html { root /var/www/site/public; internal; }
location = /50x.html { root /var/www/site/public; internal; }

server_tokens off;

internal significa que a la página solo se llega como error, no escribiendo su dirección. server_tokens off quita la versión de todas las respuestas y de todas las páginas de error.

Apache y LiteSpeed

ErrorDocument 404 /404.html
ErrorDocument 500 /50x.html
ServerSignature Off

Qué debe contener la página

  • Una frase clara que diga qué ha pasado, sin traza de ejecución.
  • Un enlace a la portada y a la búsqueda.
  • La misma cabecera y el mismo pie que el resto del sitio, para que no parezca un callejón sin salida.
  • Nada cargado desde una ruta que también pueda estar rota: incrusta el CSS si puedes.
Una página 404 debe devolver estado 404, no 200. Un 404 blando —una página amable con estado de éxito— hace que toda dirección mal tecleada parezca contenido real, y los buscadores las indexarán todas.
curl -sSI https://yourdomain.com/no-such-page | head -1
# HTTP/2 404

La página 500 es otro caso

Se muestra cuando la aplicación está rota, así que no puede depender de la aplicación. Mantenla como un archivo estático que el servidor web pueda servir por sí solo.