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