NGINX SSI работает нормально, но LAST_MODIFIED возвращает «(нет)»?

У меня NGINX SSI работает нормально в файле virtualHosts (код ниже), но возвращает «(нет)», хотя в документации 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_modifiedупоминается в документации для модуля NGINX ngx_http_sub_module, но AFAIK (и я не специалист по NGINX), я не уверен, что это сильно поможет.

1 ответ

Почему NGINX предоставляет другие документированные функции SSI, но не LAST_MODIFIED в заголовке?

Потому что nginx все равно не полностью реализовал SSI. Цитирую документы:

В настоящее время список поддерживаемых команд SSI неполный.

Список поддерживаемых команд и переменных SSI можно найти здесь .


Редактировать:

Если требуется полная поддержка SSI, попробуйте использовать Apache httpd позади nginx.

согласно документации NGIX (так в оригинале) (см. ссылку в моем посте)

Вот прямая цитата из документов от 21 июля 2021 г.:

Позволяет сохранить поле заголовка исходного ответа во время обработки SSI для облегчения кэширования ответа.

По умолчанию поле заголовка удаляется, поскольку содержимое ответа изменяется во время обработки и может содержать динамически генерируемые элементы или части, которые изменяются независимо от исходного ответа.

По умолчанию при ответе на запрос статического файла nginx добавляет заголовок ответа HTTP.

При использовании SSI nginx намеренно удаляет этот заголовок, поскольку nginx генерирует страницу динамически , а не возвращает статический файл, поэтому добавление заголовка ответа бессмысленно.

ssi_last_modifiedдиректива повторно добавляетLast-ModifiedЗаголовок ответа HTTP в соответствии с временной меткой файла сценария SSI.

Ни в коем случае не сказано, что эта директива добавляет переменную в SSI nginx.

все равно следует поддерживать

AFAIK, не существует ни стандарта, ни RFC, на которые можно было бы положиться для полной реализации SSI. Возможно, документация к mod_include могла бы быть таким стандартом, но опять же, это всего лишь руководство к другому продукту. Сообщите мне, существует ли такой стандарт, и я исправлю этот ответ.

У вас будет больше шансов решить эту проблему, отправив запрос функции в Trac nginx .

Касательная: даже если это поддерживается, если вы добавитеLAST_MODIFIED, должно ли его значение быть меткой времени сценария SSI или меткой времени сервера; поскольку ответ HTML генерируется «на лету», а не считывается напрямую из файла.

Это для устаревших сайтов, которые я перешел на NGINX с Apache. Некоторые крупные сайты до сих пор используют SSI, и это полезный упрощенный подход, позволяющий избежать PHP и т. д.

Я сомневаюсь, что эти крупные сайты все еще тайно используют SSI. На данный момент SSI представляет собой устаревшую структуру с множеством доступных альтернатив.

Другие вопросы по тегам