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

rpl*_*iko 6 http nginx

我有一个文件夹中的备忘录集合 一个/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" -->
Run Code Online (Sandbox Code Playgroud)

这很有效,但我不喜欢单项文件中的 SSI 语句。我更愿意指示 nginx 自动提供页眉和页脚,配置类似于

location ~ /memos/[\w-]+$ {
  sendfile /memos/before.html;
  sendfile $request_filename;
  sendfile /memos/after.html;
}
Run Code Online (Sandbox Code Playgroud)

这可能吗?是否有一个 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;
    }

 }
Run Code Online (Sandbox Code Playgroud)

$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>
Run Code Online (Sandbox Code Playgroud)

但是,我不会关闭这个主题,因为我仍然对原始问题感兴趣,是否可以指示 nginx 将一个响应组合为多个文件的序列。

小智 1

您可以使用附加模块 ( ngx_http_addition_module),该模块需要在构建时启用 ( --with-http_addition_module):

\n\n
location / {\n    add_before_body /before_action;\n    add_after_body  /after_action;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,它不允许堆叠任意数据,而是提供在主响应之前和之后添加内容的功能。可以通过使用带有另一个加法指令的位置来堆叠加法调用add_*_body,但我还没有尝试过 \xe2\x80\x93 ,它肯定会降低配置的可读性。

\n