配置 nginx 以发送带有 HTTP 正文的标头和页脚的响应

配置 nginx 以发送带有 HTTP 正文的标头和页脚的响应

我在一个文件夹中收集了一些备忘录,/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,但我还没有尝试过 - 而且它肯定会降低配置的可读性。

相关内容