У меня есть коллекция заметок в папке /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
который работает как описано?
Преимущества будут:
grep
изд.РЕДАКТИРОВАТЬ (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
, но я этого не пробовал - и это определенно снизит читаемость вашей конфигурации.