Me gustaría alojar archivos HTML cargados por los usuarios y necesito mostrar un 404 personalizado si lo proporcionaron, o mostrar mi propio 404 de lo contrario.
Ejemplo de flujo de trabajo:
pages/page1.html no existe pero $user ha subido 404.html así que muéstralo404.html , así que mostraré un mensaje simple yo mismoHasta ahora he cubierto los pasos 1 y 2, pero no puedo hacer la lógica para el último.
Mi configuración /simplificada/:
# each user has their own storage path etc # just to illustrate map $host $user { dog.example.com group/1/2/3; cat.example.com group/4/5/1; dog-want-cookie.example.com group/9/9/9; } server { listen 8000; server_name ~^(?<vhost>[^.]*)\.example\.com$; root /sites/$user; location / { try_files $uri $uri/index.html @not_found; } location @not_found { internal; error_page 404 /404.html; } }No estoy seguro de dónde "invocar" una configuración para mi propia "página" de error.
location @my404 { return 404 "Page not found."; }Estoy usando Nginx 1.19.3 en Debian.
Use error_page para invocar la ubicación nombrada en lugar de try_files . Vea este documento para más detalles.
Por ejemplo:
error_page 404 @not_found; location / { try_files $uri $uri/index.html =404; } Use try_files para probar la existencia del archivo 404.html .
Por ejemplo:
location @not_found { try_files /404.html /fallback404.html =404; } No es necesario marcar las ubicaciones con nombre como internal , ya que no se puede acceder a ellas desde el exterior.
En el ejemplo anterior, el archivo fallback404.html está en la misma raíz del documento. El =404 es necesario para la sintaxis, pero nunca se alcanza porque el segundo archivo siempre existe. Vea este documento para más detalles.
Para usar un archivo 404.html de respaldo en una raíz de documento diferente, puede conectar en cascada dos ubicaciones con nombre.
Por ejemplo:
location @not_found { try_files /404.html @fallback; } location @fallback { root /path/to/fallback/files; try_files /404.html =404; } Como alternativa, puede reemplazar el contenido de la ubicación @fallback con su declaración de return .
Por ejemplo:
location @fallback { return 404 "Page not found."; }