Configure nginx para enviar resposta com cabeçalho e rodapé para o corpo HTTP

4

Eu tenho uma coleção de memorandos em uma pasta /memos/items/ Um único memorando usado para conter uma instrução de inclusão SSI para uma parte do cabeçalho HTML, até e incluindo a abertura <body> , seguida pelo código HTML do conteúdo da nota , e no final um outro SSI incluir declaração para o rodapé que continha o código para fechar o documento HTML, da seguinte forma:

<!--# include file="/memos/header.html" -->
Dies ist ein <i>Testeintrag</i>.
<blockquote>
Man soll den Tag
nicht vor dem Abend loben
</blockquote>
<!--# include file="/memos/footer.html" -->

Isso funciona muito bem, mas não gosto das instruções SSI no arquivo de item único. Eu preferiria instruir o nginx para servir o cabeçalho e o rodapé automaticamente, com uma configuração semelhante a

location ~ /memos/[\w-]+$ {
  sendfile /memos/before.html;
  sendfile $request_filename;
  sendfile /memos/after.html;
}

Isso é possível? Existe um módulo nginx fornecendo uma diretiva sendfile que funciona como descrito?

As vantagens seriam:

  • A pasta que contém os itens contém apenas o conteúdo puro, nenhuma diretiva adicional. Ao fornecer uma função "Pesquisar", a pasta poderia, portanto, ser grep ed.
  • A redundância é evitada (as instruções "include" para cabeçalho e rodapé existem apenas uma vez, não em cada arquivo duplicado.

EDIT (2016/07/01)

Enquanto isso, encontrei uma solução com SSI com os pontos de vantagem acima (isto é, fornecendo apenas os arquivos de itens, sem tags ssi), simplesmente alterando a perspectiva: Em vez de incluir cabeçalho e rodapé em cada arquivo de item individual, Eu incluo o arquivo de item em um único modelo mestre.

Inspirado pela proposta no site nginx ; Eu configuro

 location /memos/ {

    ssi on;

    default_type text/html;

    location ~ /memos/([\w-]+)$ {
      set $inc /memos/items/$1;
      rewrite ^ /memos/template.html break;
    }

 }

e use a variável $inc no mestre template.html :

<!doctype html>
<html lang="de">
  <head>
    <meta charset="utf-8">
    ...
  </head>
  <body>
    <div id="content">

<!--# include file="$inc" -->

    </div>
    <script src="main.js"></script>
    <script src="items.js"></script>
  </body>
</html>

No entanto, não irei fechar este tópico, pois ainda estou interessado na pergunta original sobre se é possível instruir o nginx a compor uma resposta como uma sequência de vários arquivos.

    
por rplantiko 30.06.2016 / 22:32

1 resposta

1

Você pode usar o módulo de adição ( ngx_http_addition_module ) , que precisa ser ativado na criação tempo ( --with-http_addition_module ):

location / {
    add_before_body /before_action;
    add_after_body  /after_action;
}

Observe que ele não permite o empilhamento de dados arbitrários, mas fornece recursos para adicionar conteúdo antes e depois da resposta principal. Pode ser possível empilhar invocações de adição usando um local com outra instrução de adição como add_*_body , mas eu não tentei isso - e isso certamente reduziria a legibilidade de sua configuração.

    
por 14.07.2016 / 18:38

Tags