NGINX SSI 工作正常,但 LAST_MODIFIED 返回“(无)”?

NGINX SSI 工作正常,但 LAST_MODIFIED 返回“(无)”?

我在 virtualHosts 文件中的 NGINX SSI 运行良好(下面的代码),但LAST_MODIFIED返回“(无)”,尽管NGINX 的 SSI 文档声明该ssi_last_modified指令出现在版本 1.5.1 中(我们正在运行版本 1.14.2)。

虚拟主机文件:


  location / {
    ssi on;
    ssi_last_modified on;
  }

在 .html 文件中:

<!--#if expr="$footer_id='blackfooter'" --><div id="blackfooter"><!--#else --><div id="footer"><!--#endif -->
    <!--#config timefmt="%A %d %B %Y" --><p>Updated: <!--#echo var="LAST_MODIFIED" --> | Today: <!--#echo var="DATE_LOCAL" --></p>
</div>

所以现在我求助于 JavaScript:

<!--#if expr="$footer_id='blackfooter'" --><footer id="blackfooter"><!--#else --><footer><!--#endif -->
    <!--#config timefmt="%A %d %B %Y" --><p>Updated: <span id="updated"></span> | Today: <!--#echo var="DATE_LOCAL" --></p>
</footer>
<script>
    let lastmod = new Date(document.lastModified);
    updated.innerHTML = lastmod.toString().substring(4,15);
</script>

为什么是NGINX 提供其他已记录的 SSI 功能, 但不是LAST_MODIFIED在标题中?

我发现的唯一可能的线索sub_filter_last_modifiedNGINX ngx_http_sub_module 文档但据我所知(我不是 NGINX 专家)我不确定这是否有很大帮助。

答案1

为什么 NGINX 提供了其他记录的 SSI 功能,但没有提供标头中的 LAST_MODIFIED?

因为 nginx 还没有完全实现 SSI。引用文档

目前,支持的 SSI 命令列表不完整。

有关受支持的 SSI 命令和变量的列表,请查看 nginx 的源代码这里


编辑:

如果需要完整的 SSI 支持,请尝试在 nginx 后面使用 Apache httpd。

根据 NGIX (sic) 文档(请参阅我的帖子中的链接)

以下是直接引述ssi_last_modified文档大约 2021 年 7 月 21 日:

允许Last-Modified在 SSI 处理期间保留原始响应的标头字段以方便响应缓存。

默认情况下,标头字段会被删除,因为响应的内容在处理过程中会被修改,并且可能包含独立于原始响应而更改的动态生成的元素或部分。

默认情况下,nginx 在响应静态文件请求时,会添加Last-ModifiedHTTP响应头。

当使用 SSI 时,nginx 会故意删除此标头,因为 nginx 正在生成页面动态地而不是返回静态文件,因此添加Last-Modified响应标头是没有意义的。

ssi_last_modifiedLast-Modified指令根据 SSI 脚本文件时间戳重新添加HTTP 响应头。

它绝对没有说该指令会将LAST_MODIFIED变量添加到 nginx 的 SSI。

LAST_MODIFIED应该仍然支持

据我所知,目前还没有标准或 RFC 可以完全实现 SSI。可以说,文档到 mod_include可以是这样的标准,但是同样,它只是另一种产品的手册。如果有这样的标准,请告诉我,我会修改这个答案。

您可以通过向以下地址提交功能请求来更好地解决此问题nginx 的 Trac

切线:即使它受支持,如果添加LAST_MODIFIED,它的值应该是 SSI 脚本的时间戳或服务器时间戳;因为 HTML 响应是动态生成的,而不是直接从文件中读取。

这是针对我从 Apache 迁移到 NGINX 的旧网站。一些大型网站仍在使用 SSI,这是一种有用的轻量级方法,可以避免使用 PHP 等。

我怀疑那些大型网站是否仍在幕后使用 SSI。目前,SSI 是一个遗留框架,有很多可用的替代方案。

相关内容