我在一个文件夹中收集了一些备忘录,/memos/items/
其中一份备忘录用于包含 HTML 标头部分的 SSI 包含语句,直到开头<body>
,然后是备忘录内容的 HTML 代码,最后是页脚的另一个 SSI 包含语句,其中包含用于关闭 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;
}
sendfile
这可能吗?是否有一个 nginx 模块提供如描述一样工作的指令?
优点是:
- 包含项目的文件夹仅包含纯内容,没有附加指令。因此,当提供“搜索”功能时,可以
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
并在 master 中使用变量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 将一个响应组成几个文件的序列。
答案1
您可以使用加法模块 ( ngx_http_addition_module
),需要在构建时启用(--with-http_addition_module
):
location / {
add_before_body /before_action;
add_after_body /after_action;
}
请注意,它不允许堆叠任意数据,而是提供在主响应之前和之后添加内容的功能。可能可以通过使用带有另一个附加指令的位置来堆叠附加调用add_*_body
,但我还没有尝试过 - 而且它肯定会降低配置的可读性。