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

У меня 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) я не уверен, что это сильно помогает.

1
задан 17 July 2021 в 14:41
1 ответ

Почему 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 - это устаревший фреймворк с множеством доступных альтернатив.

4
ответ дан 28 July 2021 в 12:50

Теги

Похожие вопросы