У меня NGINX SSI работает нормально в файле virtualHosts (код ниже), но LAST_MODIFIED
возвращает "(none)", хотя в NGINX docs for SSI говорится, что директива ssi_last_modified
появилась в версии 1.5.1 (у нас версия 1.14.2).
Файл VirtualHost:
…
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_modified
упоминается в документации для NGINX ngx_http_sub_module, но AFAIK (а я не специалист по NGINX) я не уверен, что это сильно помогает.
Почему NGINX предоставляет другие задокументированные функции SSI, но не LAST_MODIFIED в заголовке?
Потому что nginx в любом случае не реализовал SSI полностью. Цитата в документации :
В настоящее время список поддерживаемых команд SSI неполон.
Список поддерживаемых команд и переменных SSI можно найти в исходном коде nginx здесь .
Изменить:
Если требуется полная поддержка SSI, попробуйте использовать Apache httpd за nginx.
согласно документации NGIX (sic) (см. Ссылку в моем сообщении)
Вот прямая цитата из ssi_last_modified
docs около 21 июля 2021 года:
Позволяет сохранить
Поле заголовка Last-Modified
из исходного ответа во время обработки SSI для облегчения кэширования ответа.По умолчанию поле заголовка удаляется, поскольку содержимое ответа изменяется во время обработки и может содержать динамически сгенерированные элементы или части, которые изменяются независимо от исходного ответа.
По умолчанию, отвечая на запрос статического файла, nginx добавляет HTTP-заголовок ответа Last-Modified
.
При использовании SSI nginx намеренно удаляет этот заголовок, потому что nginx генерирует страницу динамически вместо того, чтобы возвращать статический файл, поэтому добавление заголовка ответа Last-Modified
бессмысленно.
ssi_last_modified
директива повторно добавляет Last-Modified
заголовок ответа HTTP в соответствии с временной меткой файла сценария SSI.
Ни в коем случае не говорится, что эта директива добавляет переменную LAST_MODIFIED
в SSI nginx.
LAST_MODIFIED
по-прежнему должен поддерживаться
AFAIK, нет ни стандарта, ни RFC, на которые можно было бы положиться для полной реализации SSI. Возможно, docs к mod_include могут быть таким стандартом, но, опять же, это всего лишь руководство к другому продукту. Сообщите мне, есть ли такой стандарт, и я исправлю этот ответ.
У вас будет больше шансов решить эту проблему, отправив запрос функции в nginx's Trac .
Касательная: даже если она поддерживается, если вы добавите LAST_MODIFIED
, значение должно быть меткой времени сценария SSI или меткой времени сервера; поскольку HTML-ответ создается "на лету", а не напрямую читается из файла.
Это для устаревших сайтов, которые я перешел на NGINX с Apache. Некоторые крупные сайты по-прежнему используют SSI, и это полезный легкий подход, избегающий PHP и т. Д.
Я сомневаюсь, что эти большие сайты все еще используют SSI за кулисами. На данный момент SSI - это устаревший фреймворк с множеством доступных альтернатив.