6 votes

Configurer nginx pour envoyer une réponse avec en-tête et pied de page pour le corps HTTP

J'ai une collection de mémos dans un dossier /memos/items/. Un seul mémo contenait auparavant une déclaration d'inclusion SSI pour une partie d'en-tête HTML, jusqu'à et y compris l'ouverture , suivi du code HTML du contenu du mémo, et à la fin une autre déclaration d'inclusion SSI pour le pied de page qui contenait le code pour fermer le document HTML, comme ceci :

Dies ist ein Testeintrag.

Man soll den Tag
nicht vor dem Abend loben

Cela fonctionne plutôt bien, mais je n'aime pas les déclarations SSI dans le fichier d'élément unique. Je préférerais demander à nginx de servir automatiquement l'en-tête et le pied de page, avec une configuration similaire à

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

Est-ce possible ? Y a-t-il un module nginx fournissant une directive sendfile qui fonctionne comme décrit ?

Les avantages seraient les suivants :

  • Le dossier contenant les éléments contient uniquement le contenu pur, sans directive supplémentaire. En fournissant une fonction "Recherche", le dossier pourrait donc être grepé.
  • La redondance est évitée (les instructions "include" pour l'en-tête et le pied de page n'existent qu'une seule fois, pas dans chaque fichier dupliqué.

MODIFIER (01/07/2016)

Entre-temps, j'ai trouvé une solution avec SSI avec les points d'avantage ci-dessus (c'est-à-dire en fournissant uniquement le contenu des fichiers d'éléments, sans balises SSI), en changeant simplement de perspective : au lieu d'inclure l'en-tête et le pied de page dans chaque fichier d'élément individuel, j'inclus le fichier d'élément dans un modèle maître unique.

Inspiré de la proposition sur le site nginx ; je configure

 location /memos/ {

    ssi on;

    default_type text/html;

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

 }

et j'utilise la variable $inc dans le template.html maître :

    ...

Cependant, je ne vais pas clôturer ce sujet car je suis toujours intéressé par la question initiale de savoir s'il est possible de demander à nginx de composer une seule réponse sous forme de séquence de plusieurs fichiers.

1voto

dst Points 146

Vous pouvez utiliser le module d'addition (ngx_http_addition_module), qui doit être activé lors de la construction (--with-http_addition_module) :

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

Notez que cela ne permet pas l'empilement de données arbitraires, mais fournit plutôt des fonctionnalités pour ajouter du contenu avant et après la réponse principale. Il pourrait être possible d'empiler les invocations d'addition en utilisant une autre instruction additionnelle dans une localisation avec add_*_body, mais je n'ai pas essayé ça - cela réduirait certainement la lisibilité de votre configuration.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X