Nginx: режим обслуживания с проверкой "является разработчиком"
В интернете описано много вариантов отображения страницы обслуживания с помощью nginx. Но я не нашел решения, чтобы проверить, является ли пользователь разработчиком, и не отображать страницу поддержки для разработчиков.
Я использую try_files, который не работает так, как мне нужно, после ввода любого IF-раздела. Поэтому я сделал свое собственное решение, которым хочу поделиться. Он работает в любой конфигурации с try_files, прокси и так далее.
2 ответа
- В - httpраздел (из любого- serverраздел) проверить пользователя, если он разработчик:- map $http_cookie $isDevHack { default ""; ~DEVELOPER_SECRET=1010 "/non-existed-location"; }- Пользователь является разработчиком, если он имел - DEVELOPER_SECRETс- 1010значение в этом случае. Эта карта является общей для всех серверов в конфигурации.
- присоединять - serverраздел с обработчиком ошибок 503:- error_page 503 @maintenance; location @maintenance { rewrite ^(.*)$ /maintenance-mode.html break; }- maintenane-mode.htmlявляется страницей, отображаемой для пользователей, не являющихся разработчиками, в режиме обслуживания. Путь к файлу относительно- document_rootтока- server,
- В - locationразделы, которые должны быть защищены в режиме обслуживания, добавляются перед любыми правилами обычного режима:- if (-f "$isDevHack/home/site-home/maintenance") { return 503; }- Если текущий пользователь является разработчиком, перед проверенным именем файла будет стоять - /non-existed-locationпрефикс и- ifникогда не будет введен.
У меня довольно простая настройка сервера, для которой конфигурация в конце ответа сделает следующее:
- Если файл с именем - MAINTENANCEсуществует один уровень выше корня, тогда сервер будет в режиме обслуживания. (Это- -fтестовое задание).
- За исключением того, что если существует файл cookie с именем - foo_devсо значением- secret!описанная выше проверка будет обойдена, и nginx будет обслуживать данные, как если бы сервер не находился в режиме обслуживания. (Это- $cookie_foo_dev = "secret!"тестовое задание.)
Я пробовал с некоторыми try_files настройки и не столкнулись с какой-либо проблемой.
Вот конфигурация.
server {
    # ... omitted stuff that does not pertain to the solution ...
    root <some path>;
    if ($cookie_foo_dev = "secret!") {
        break;
    }
    if ( -f $document_root/../MAINTENANCE) {
       return 503;
    }
    error_page 503 @maintenance;
    location @maintenance {
        rewrite ^(.*)$ /maintenance.html break;
    }
    location / {
        proxy_pass http://localhost:8000;
    }
}
Все входящие соединения должны использовать HTTPS, поэтому файл cookie никогда не передается в виде обычного текста через Интернет.
Я также установил сервер, на который nginx пересылает запросы для отображения большого жирного предупреждения, если cookie foo_dev настроен так, чтобы я по ошибке не забыл, что сайт находится в режиме обслуживания.