Перейти к содержимому

404 Not Found в Hugo

Pipeline

Это один из постов о советах и трюках, которые я использовал при настройке блога на Hugo.

Я хотел создать страницу 404. Конечно, я загуглил что-то вроде "404 page hugo" и конечно же попал на официальную документацию.

Официальная документация Hugo по этой теме довольно бедна в плане деталей.

У меня есть статический сайт, который хостится на Nginx, запущенном внутри Docker-контейнера.

Итак, есть 3 шага для реализации этой идеи.

Во-первых, нам нужно создать саму страницу, используя HTML-шаблонизатор Hugo. Затем нужно настроить сервер (Nginx), чтобы использовать эту страницу в случае ошибки 404. В качестве бонуса, хотя для меня это обязательно, мне нужно поместить настроенный сервер внутрь Docker-образа, который загружается в registry.

Hugo

Давайте посмотрим, что говорит документация. Создайте шаблон 404.html внутри layout/404.html

{{ define "main"}}
    <main id="main">
      <div>
       <h1 id="title"><a href="{{ "/" | relURL }}">Go Home</a></h1>
      </div>
    </main>
{{ end }}

Вы можете использовать любую разметку, которую хотите. Это полностью поддерживает шаблонизатор, который вы используете для любого шаблона Hugo.

Более того, вы можете делегировать создание layouts/404.html вашей кастомной теме, как сделал я. Таким образом ваш конкретный блог будет чистым от подобных layouts.

Nginx

В документации есть часть Automatic Loading. Здесь можно увидеть общий подход для некоторых известных серверов.

Nginx. You might specify error_page 404 /404.html; in your nginx.conf file.

Где находится этот конфиг и как его обновить?

По умолчанию Nginx использует конфиг, который находится здесь: /etc/nginx/conf.d/default.conf. Я просто взял его дефолтную версию и немного изменил вот так:

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page 404 /404.html; # Здесь и ниже — обработка ошибки 404, которую пыталась описать документация
    location = /404.html {
        root   /usr/share/nginx/html;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

}

Docker

Теперь мы знаем, что нужно изменить конфиг Nginx. Nginx запускается в Docker-контейнере для нашего Docker-образа. У меня есть Dockerfile в корне проекта Hugo, это конфиг, который используется для создания Docker-образа. Скопируйте и вставьте конфиг Nginx из предыдущего шага в ту же директорию, что и Dockerfile. Я назвал его nginx.conf. Затем обновите Dockerfile вот так:

FROM nginx:alpine
COPY ./public /usr/share/nginx/html

# Буквально скопировать файл nginx.conf из директории Dockerfile в /etc/nginx/conf.d/default.conf контейнера
COPY ./nginx.conf /etc/nginx/conf.d/default.conf

EXPOSE 80

Результат

Вы можете увидеть "демо" на этом сайте. Просто введите любой невалидный URL в адресную строку, и вы увидите содержимое моей страницы 404.

Для более специфичных деталей вы можете посмотреть мой предыдущий пост о полном pipeline для деплоя блога, который я настроил.