Назад | Перейти на главную страницу

Настройте nginx для отправки ответа с заголовком и нижним колонтитулом для тела HTTP

У меня есть коллекция заметок в папке /memos/items/ Одно мемо, используемое для содержания инструкции SSI include для части заголовка HTML, вплоть до открытия <body>, за которым следует HTML-код содержимого памятки, а в конце еще один оператор SSI include для нижнего колонтитула, содержащий код для закрытия HTML-документа, например:

<!--# 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" -->

Это работает очень хорошо, но мне не нравятся инструкции SSI в файле с одним элементом. Я бы предпочел, чтобы nginx автоматически обслуживал верхний и нижний колонтитулы с конфигурацией, аналогичной

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

Это возможно? Есть ли модуль nginx, обеспечивающий директиву sendfile который работает как описано?

Преимущества будут:

РЕДАКТИРОВАТЬ (2016/07/01)

Тем временем я нашел решение с SSI с указанными выше преимуществами (т. Е. Предоставление файлов элементов только для содержимого, без тегов ssi), просто изменив перспективу: вместо включения верхнего и нижнего колонтитула в каждый отдельный файл элемента я включаю файл элемента в едином главном шаблоне.

Вдохновленный предложением о сайт nginx; Я настраиваю

 location /memos/ {

    ssi on;

    default_type text/html;

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

 }

и используйте переменную $inc в мастере 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>

Однако я не буду закрывать эту тему, поскольку меня все еще интересует исходный вопрос, можно ли указать nginx составить один ответ как последовательность из нескольких файлов.

Вы можете использовать модуль сложения (ngx_http_addition_module), который необходимо включить во время сборки (--with-http_addition_module):

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

Обратите внимание, что он не позволяет складывать произвольные данные, но вместо этого предоставляет функции для добавления содержимого до и после основного ответа. Можно было бы объединить вызовы сложения в стек, используя место с другой инструкцией сложения как add_*_body, но я этого не пробовал - и это определенно снизит читаемость вашей конфигурации.