Это много варианты описано в Интернете, как отобразить страницу обслуживания с помощью nginx. Но я не нашел решения, чтобы проверить, является ли пользователь разработчиком, и не отображать страницу обслуживания для разработчиков.
Я использую try_files, который не работает как мне нужно после ввода любого IF-раздела. Итак, я сделал собственное решение, которым хочу поделиться. Работает в любой конфигурации с try_files, прокси и так далее.
У меня довольно простая настройка сервера, для которой конфигурация в конце ответа будет делать следующее:
Если файл с именем 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
установлен, чтобы я по ошибке не забыл, что сайт находится в режиме обслуживания.
В http
раздел (из любого server
раздел) проверьте пользователя, если он разработчик:
map $http_cookie $isDevHack {
default "";
~DEVELOPER_SECRET=1010 "/non-existed-location";
}
Пользователь является разработчиком, если у него DEVELOPER_SECRET
с участием 1010
значение в этом случае. Эта карта доступна для всех серверов в config.
Добавить 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
никогда не будет введен.