我的 NGINX SSI 在 virtualHosts 文件(下面的代码)中工作正常,但LAST_MODIFIED
返回“(无)”,尽管SSI 的 NGINX 文档声明该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
标头中?
我发现的唯一可能的线索是NGINX ngx_http_sub_modulesub_filter_last_modified
的文档中提到了AFAIK(而且我不是 NGINX 专家)我不确定这有多大帮助。
因为 nginx 还没有完全实现 SSI。引用文档:
有关支持的 SSI 命令和变量的列表,请在此处查看 nginx 的源代码。
编辑:
如果需要完整的 SSI 支持,请尝试在 nginx 后面使用 Apache httpd。
这是大约 2021 年 7 月 21 日从
ssi_last_modified
文档中直接引用的内容:默认情况下,当响应一个静态文件的请求时,nginx 会添加
Last-Modified
HTTP 响应头。使用 SSI 时,nginx 故意删除这个 header,因为 nginx 是动态生成页面而不是返回静态文件,因此添加
Last-Modified
响应 header 是没有意义的。ssi_last_modified
Last-Modified
指令根据 SSI 脚本文件时间戳重新添加HTTP 响应标头。绝不是说该指令将
LAST_MODIFIED
变量添加到 nginx 的 SSI。AFAIK,没有标准,也没有 RFC,可以依靠它来完全实现 SSI。可以说,mod_include 的文档可能是这样的标准,但同样,它只是另一个产品的手册。让我知道是否有这样的标准,我会修改这个答案。
通过向nginx 的 Trac提交功能请求,您将有更好的机会解决此问题。
Tangent:即使支持,如果加上
LAST_MODIFIED
,它的值应该是SSI脚本的时间戳,还是服务器时间戳;因为 HTML 响应是即时生成的,而不是直接从文件中读取。我怀疑那些大型网站仍然在幕后使用 SSI。在这一点上,SSI 是一个遗留框架,有很多可用的替代方案。