У меня проблема с настройкой NGINX с перенаправлением на пользовательскую страницу ошибок в другом месте (, вкл. css, images, js ), если должна выдаваться страница с ошибкой.
Сначала я хотел бы заблокировать доступ к папке (типа .git
). Это можно легко сделать с помощью (внутри блока сервера )
location ~ /(.git) {
deny all;
return 404;
}
. Затем я создал собственный элемент страницы ошибки _(внутри блока сервера )с пользовательским файлом 404.html в другом месте, чем корневой каталог веб-сайта.
error_page 404 /404.html;
location = /404.html {
root /var/data/websites/error-page;
internal;
}
После этих изменениймоя пользовательская страница 404 будет отображаться -, но без css, js и изображений.
Если я просматриваю веб-сайт, причина проста :неверный путь к файлам -они основаны на местоположении (в моем примере.git
). https://it.dmetzler1988.io/.git/css/main.css net::ERR_ABORTED 404
.
Вот полный файл конфигурации NGINX для этой страницы (удалены только пути сертификатов ssl):
server {
listen 443 ssl;
listen [::]:443 ssl http2;
ssl_certificate <path>;
ssl_certificate_key <path>;
server_name it.dmetzler1988.io;
root /var/data/websites/dmetzler1988.io/it.dmetzler1988.io;
index index.html index.php;
error_page 404 /404.html;
location = /404.html {
root /var/data/websites/error-page;
internal;
}
location ~ /(.git) {
deny all;
return 404;
}
}
Итак, мои вопросы в этом месте:
.git
из пути )?Сначала об ошибках в вашем конфиге.
location ~ /(.git) {... }
Похоже, вы не совсем знакомы с шаблонами регулярных выражений PCRE. Здесь нет необходимости использовать группу захвата. -группы захвата используются, когда вам понадобится их содержимое позже. Однако это не критическая ошибка. Хуже всего то, что вы используете неэкранированные точечные символы, которые работают как подстановочные знаки в шаблонах регулярных выражений. Таким образом, вы эффективно блокируете любой URI, содержащий строку, в которой второй, третий и четвертый символы равны git
(, например. /agitation/index.html
, /any/prefix/agitation/index.html
и т. д. )Правильным шаблоном регулярного выражения здесь будет/\.git
(блокирование всего, что начинается с .git
, включая .gitignore
и т. д. на любом уровне вложенного каталога).
Затем вы используете две директивы в этом месте-deny all
и return 404
. Здесь будет достаточно только одного из них -либоdeny all
(с возвратом HTTP 403 Forbidden
), либоreturn 404
(с возвратомHTTP 404 Not Found
).Причина, по которой вы получаете 404, а не 403, заключается в том, что директива return
выполняется на этапе обработки запроса REWRITE
, а директива deny
выполняется на более позднем этапе ACCESS
(фазы обработки запроса, описанные в разработке. руководство).
Теперь вернемся к вашему вопросу. Похоже, вы ссылаетесь на свои активы, используя относительные пути URI, например.
<link rel="stylesheet" type="text/css" href="css/main.css">
Некоторые из ваших вариантов (но не ограничиваются):
встраиванием каждого ресурса в обработчик ошибок HTML (включая ваши изображения, вы можете сделать это, кодируя ваши изображения в BASE64 и используя URI данных);
переместите все активы в папку some в корневом каталоге вашего основного сайта (скажем /var/data/websites/dmetzler1988.io/it.dmetzler1988.io/assets/errors
и ссылайтесь на них, используя полный путь:
<link rel="stylesheet" type="text/css" href="/assets/errors/css/main.css">