Nginx: modo de manutenção com verificação "é um desenvolvedor"

1

São muito variantes descritas na Internet como exibir a página de manutenção com nginx . Mas não encontrei a solução para verificar se o usuário é desenvolvedor e não exibir a página de manutenção para desenvolvedores.

Eu uso o try_files, que não funciona conforme necessário qualquer seção IF foi inserida. Então eu fiz minha própria solução, que eu quero compartilhar. Ele funciona em qualquer configuração com try_files, proxy e assim por diante.

    
por Valera Leontyev 23.03.2013 / 09:02

2 respostas

1
  1. Na seção http (fora de qualquer seção server ), verifique o usuário se ele é desenvolvedor:

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

    O usuário é um desenvolvedor se tiver DEVELOPER_SECRET com 1010 neste caso. Este mapa é compartilhado para todos os servidores na configuração.

  2. Anexe a seção server com o manipulador de erros 503:

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

    maintenane-mode.html é uma página a ser exibida para usuários que não são desenvolvedores no modo de manutenção. O caminho do arquivo é relativo a document_root do atual server .

  3. Em location seções, que devem ser protegidas no modo de manutenção, adicione antes de qualquer regra de modo normal:

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

    Se o usuário atual for um desenvolvedor, o nome do arquivo marcado será prefixado com /non-existed-location prefixo e if nunca será inserido.

por 23.03.2013 / 09:02
1

Eu tenho uma configuração de servidor bastante simples para a qual a configuração no final da resposta fará o seguinte:

  1. Se um arquivo chamado MAINTENANCE existir um nível acima da raiz, o servidor estará no modo de manutenção. (Este é o teste -f ).

  2. Só que se houver um cookie chamado foo_dev com o valor secret! , a verificação descrita acima será ignorada e nginx exibirá os dados como se o servidor não estivesse no modo de manutenção. (Este é o teste $cookie_foo_dev = "secret!" .)

Eu tentei com algumas configurações de try_files e não encontrei nenhum problema.

Aqui está a configuração.

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;
    }
}

Todas as conexões de entrada são necessárias para usar HTTPS, portanto, o cookie nunca entra em texto simples pela Internet.

Eu também configurei o servidor para o qual o nginx encaminha os pedidos para exibir um aviso de grandes proporções se o cookie foo_dev for configurado para que eu não esqueça que o site está em modo de manutenção.

    
por 29.04.2015 / 20:53