Almost Over

Редирект несуществующих URL на 404 через NGINX

Редирект несуществующих URL на 404 через NGINX

Доброго времени суток всем тем, кого заинтересовала ситуация с отсутствием 404-ых страниц конкретно в Hexo. Например, при вводе отсутствующего на сайте URL (almostover.ru/qwerty) клиенту будет выдаваться заранее Вами подготовленная ссылка (almostover.ru/404).

В движках на PHP (например, WordPress) обычно таких проблем не возникает - в них по-умолчанию встроены 404-ые, в отличии от статических сайтов типа Hexo. Поэтому ниже предлагаю решение на серверном уровне.

  • Предполагается, что almostover.ru — корневая директория с исходными файлами Hexo и одновременно URL домена.

Создаём страницу в Hexo

$ hexo new page "404"

После создания страницы 404, можете редактировать её как Вам угодно. Сам файл этой страницы будет расположен в %hexo_path%/source/404/index.md, а страница будет доступна по адресу “almostover.ru/404”. Также, не стоит забывать, что при русскоязычном описании страницы, файл должен быть в кодировке UTF-8 (без BOM).

Редактируем конфиг сайта NGINX

$ nano /etc/nginx/sites/almostover.ru

В блок location в самый верх добавляем error_page 403 404 /404/;

1
2
3
4
5
6
7
8
location / {
...
error_page 403 404 /404/;

location /404/ {
internal;
}
}

И, естественно, перезаряжаем NGINX:

$ service nginx reload

Теперь при вводе любой неверной/отсутсвующей страницы, посетителя автоматически перекидывает на только что созданную нами кастомную 404-ую страницу.

Проверяем страницу 404

403 (Forbidden («запрещено»)) -> 404: almostover.ru/2016-01/
404 (Not Found («не найдено»)) -> 404: almostover.ru/qwerty

1
2
$IP - RU 0.000 [17/Aug/2016:00:51:01 +0300] [almostover.ru] "GET /2016-01/ HTTP/2.0" 403 5454 "-" "-"
$IP - RU 0.000 [17/Aug/2016:00:51:20 +0300] [almostover.ru] "GET /qwerty HTTP/2.0" 404 5450 "-" "-"