Доступ к местоположению блока NGINX и перенаправление на пользовательскую страницу ошибок

У меня проблема с настройкой 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;
    }
}

Итак, мои вопросы в этом месте:

  1. Как я могу исправить проблему с неправильным путем (удалить .gitиз пути )?
  2. Это правильный способ для такого варианта использования или есть лучшее решение?
2
задан 19 November 2021 в 23:28
1 ответ

Сначала об ошибках в вашем конфиге.

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">
    
0
ответ дан 20 November 2021 в 05:15

Теги

Похожие вопросы