diff --git a/readthedocs/core/views/__init__.py b/readthedocs/core/views/__init__.py index 8fcccb749fb..a6d106fca18 100644 --- a/readthedocs/core/views/__init__.py +++ b/readthedocs/core/views/__init__.py @@ -145,7 +145,7 @@ def server_error_404_subdomain(request, template_name='404.html'): the Docs default page (Maze Found) is rendered by Django and served. """ - def resolve_404_path(project, version_slug=None, language=None): + def resolve_404_path(project, version_slug=None, language=None, filename='404.html'): """ Helper to resolve the path of ``404.html`` for project. @@ -159,7 +159,7 @@ def resolve_404_path(project, version_slug=None, language=None): project, version_slug=version_slug, language=language, - filename='404.html', + filename=filename, subdomain=True, # subdomain will make it a "full" path without a URL prefix ) @@ -197,16 +197,17 @@ def resolve_404_path(project, version_slug=None, language=None): # Firstly, attempt to serve the 404 of the current version (version_slug) # Secondly, try to serve the 404 page for the default version (project.get_default_version()) for slug in (version_slug, project.get_default_version()): - basepath, filename, fullpath = resolve_404_path(project, slug, language) - if os.path.exists(fullpath): - log.debug( - 'serving 404.html page current version: [project: %s] [version: %s]', - project.slug, - slug, - ) - r = static_serve(request, filename, basepath) - r.status_code = 404 - return r + for tryfile in ('404.html', '404/index.html'): + basepath, filename, fullpath = resolve_404_path(project, slug, language, tryfile) + if os.path.exists(fullpath): + log.debug( + 'serving 404.html page current version: [project: %s] [version: %s]', + project.slug, + slug, + ) + r = static_serve(request, filename, basepath) + r.status_code = 404 + return r # Finally, return the default 404 page generated by Read the Docs r = render(request, template_name)