Рейтинг:2

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

флаг cn

У меня проблема с моей настройкой NGINX с перенаправлением на пользовательскую страницу ошибки в другом месте (включая css, изображения, js), если должна быть выброшена страница ошибки.

Сначала я хотел бы заблокировать доступ к папке (например, .git). Это можно легко сделать через (внутри блока сервера)

расположение ~ /(.git) {
    отрицать все;
    вернуть 404;
}

Затем я создал настраиваемый элемент error_page (внутри блока сервера) с настраиваемым файлом 404.html в месте, отличном от корневого каталога веб-сайта.

страница_ошибки 404 /404.html;
местоположение = /404.html {
    корень /var/data/websites/error-page;
    внутренний;
}

После этих изменений будет отображаться моя пользовательская страница 404, но без css, js и изображений.

Если я просматриваю веб-сайт, причина проста: путь к файлам неверен - они основаны на местоположении (в моем примере .git). https://it.dmetzler1988.io/.git/css/main.css сеть::ERR_ABORTED 404.

Вот полный файл конфигурации NGINX для этой страницы (удалены только пути сертификатов ssl):

сервер {
    слушать 443 ssl;
    слушать [::]:443 ssl http2;

    ssl_certificate <путь>;
    ssl_certificate_key <путь>;

    имя_сервера it.dmetzler1988.io;
    корень /var/data/websites/dmetzler1988.io/it.dmetzler1988.io;
    индекс index.html index.php;

    страница_ошибки 404 /404.html;
    местоположение = /404.html {
        корень /var/data/websites/error-page;
        внутренний;
    }

    расположение ~ /(.git) {
        отрицать все;
        вернуть 404;
    }
}

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

  1. Как я могу исправить проблему с неправильным путем (удалить .git с пути)?
  2. Это правильный способ для такого варианта использования или есть лучшее решение?
флаг sv
Добро пожаловать в ServerFault. Лучше всего хранить активы (main.css, main.js и т. д.) в отдельной папке (например, в /example-folder/), а затем использовать дополнительный блок местоположения (`location /example-folder/ { alias "/ path/to/example-folder"; }`) с пользовательским корнем или псевдонимом для обслуживания этих файлов.
Ivan Shatsky avatar
флаг gr
@PothiKalimuthu Для правильной работы вашего решения требуется директива alias /path/to/example-folder/ (обратите внимание на косую черту в конце).Без этого запрос типа `/example-folder/css/main.css` будет обслуживаться как `/path/to/example-foldercss/main.css`, что, очевидно, даст вам ошибку `HTTP 404 Not Found`. Я описал это поведение псевдонима [здесь] (https://stackoverflow.com/a/69296739/7121513).
devKyrios avatar
флаг cn
@IvanShatsky Я пробовал так, как вы описали (также пробовал разные модификации), но это не сработает для моего css (использовал только путь css для тестов). `location ~* /.git/css/.* { root /var/data/websites/error-page/css; }`. Что-то не так? Я получаю ошибку 404 для этого файла также после добавления нового местоположения.
Ivan Shatsky avatar
флаг gr
@devKyrios Можете ли вы добавить конфигурацию, которую вы пробовали, в качестве обновления к вашему вопросу?
devKyrios avatar
флаг cn
@IvanShatsky, ха-ха, извините, с редактированием было медленнее. Теперь добавлено. Я пробовал с `/.*` в конце и без него. Также с местами, чувствительными к регистру, и так далее.
devKyrios avatar
флаг cn
@IvanShatsky, черт возьми... извини, неважно - мой провал. Это не работает с блоком местоположения, который я добавил вчера (`location ~ /\.git { return 404; }`). У меня есть перекрывающийся блок местоположения. Сожалею.
Рейтинг:0
флаг gr

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

местоположение ~ /(.git) { ... }

Похоже, вы не совсем знакомы с шаблонами регулярных выражений PCRE. Здесь нет необходимости использовать группу захвата — группы захвата используются, когда вам понадобится их содержимое позже. Однако это не критическая ошибка. Хуже всего то, что вы используете неэкранированные точечные символы, которые работают как подстановочные знаки в шаблонах регулярных выражений. Таким образом, вы эффективно блокируете любой URI, содержащий строку, в которой второй, третий и четвертый символы мерзавец (например. /агитация/index.html, /любой/префикс/агитация/index.htmlи т. д.) Правильный шаблон регулярного выражения здесь будет /\.git (блокировка всего, что начинается с .git в том числе .gitignoreи т. д. на любом уровне вложенного каталога).

Затем вы используете две директивы в этом месте: отрицать все и вернуть 404. Здесь будет достаточно только одного из них - либо отрицать все (возвращение HTTP 403 Запрещено) или же вернуть 404 (возвращение HTTP 404 не найден). Причина, по которой вы получаете 404, а не 403, заключается в том, что возвращаться директива, выполненная в ПЕРЕПИСАТЬ этап обработки запроса во время Отрицать один казнен позже ДОСТУП этап (этапы обработки запроса, описанные в руководство по развитию).

Теперь вернемся к вашему вопросу. Похоже, вы ссылаетесь на свои активы, используя относительные пути URI, например.

<link rel="stylesheet" type="text/css" href="css/main.css">

Некоторые из ваших вариантов (но не ограничиваясь ими):

  • встраивайте каждый актив в обработчик ошибок HTML (включая ваши изображения, вы можете сделать это, закодировав свои изображения в BASE64 и используя URI данных);

  • переместите все активы в некоторую папку под корневым каталогом вашего основного сайта (например, /var/data/websites/dmetzler1988.io/it.dmetzler1988.io/assets/errors и ссылайтесь на них, используя полный путь:

    <link rel="stylesheet" type="text/css" href="/assets/errors/css/main.css">
    
devKyrios avatar
флаг cn
Во-первых, большое спасибо за ваш полезный отзыв! Мои знания о регулярных выражениях в NGINX кажутся неверными. Кроме того, информация о директиве была очень полезной, так что я буду в безопасности только с директивой `return 404`. Обе ваши идеи по решению проблемы с источниками были бы решением, но я не хотел дублировать код и оставлю его легко редактируемым/понятным (без кодировки base64 и css/js в html). Я надеюсь, что существует решение с модификациями root, proxy или подобным. Еще раз спасибо за очень конструктивные и полезные отзывы!!

Ответить или комментировать

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