Nginx: режим обслуживания с проверкой "является разработчиком"

В интернете описано много вариантов отображения страницы обслуживания с помощью nginx. Но я не нашел решения, чтобы проверить, является ли пользователь разработчиком, и не отображать страницу поддержки для разработчиков.

Я использую try_files, который не работает так, как мне нужно, после ввода любого IF-раздела. Поэтому я сделал свое собственное решение, которым хочу поделиться. Он работает в любой конфигурации с try_files, прокси и так далее.

2 ответа

Решение
  1. В http раздел (из любого server раздел) проверить пользователя, если он разработчик:

    map $http_cookie $isDevHack {
        default "";
        ~DEVELOPER_SECRET=1010 "/non-existed-location";
    }
    

    Пользователь является разработчиком, если он имел DEVELOPER_SECRET с 1010 значение в этом случае. Эта карта является общей для всех серверов в конфигурации.

  2. присоединять server раздел с обработчиком ошибок 503:

    error_page 503 @maintenance;
    location @maintenance {
         rewrite ^(.*)$ /maintenance-mode.html break;
    }
    

    maintenane-mode.html является страницей, отображаемой для пользователей, не являющихся разработчиками, в режиме обслуживания. Путь к файлу относительно document_root тока server,

  3. В location разделы, которые должны быть защищены в режиме обслуживания, добавляются перед любыми правилами обычного режима:

    if (-f "$isDevHack/home/site-home/maintenance") {
        return 503;
    }
    

    Если текущий пользователь является разработчиком, перед проверенным именем файла будет стоять /non-existed-location префикс и if никогда не будет введен.

У меня довольно простая настройка сервера, для которой конфигурация в конце ответа сделает следующее:

  1. Если файл с именем MAINTENANCE существует один уровень выше корня, тогда сервер будет в режиме обслуживания. (Это -f тестовое задание).

  2. За исключением того, что если существует файл 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 настроен так, чтобы я по ошибке не забыл, что сайт находится в режиме обслуживания.

Другие вопросы по тегам