Рейтинг:1

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

флаг cn

У меня NGINX SSI отлично работает в файле virtualHosts (код ниже), но ПОСЛЕДНЕЕ ИЗМЕНЕНИЕ возвращает "(нет)", хотя Документация NGINX для SSI заявить, что ssi_last_modified директива появилась в версии 1.5.1 (мы используем версию 1.14.2).

Файл виртуального хоста:

¦
  место расположения / {
    вкл.;
    ssi_last_modified на;
    ¦
  }
¦

и в файле .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, но нет ПОСЛЕДНЕЕ ИЗМЕНЕНИЕ в заголовке?

Единственная возможная подсказка, которую я нашел, заключалась в том, что sub_filter_last_modified упоминается в документы для NGINX ngx_http_sub_module но, насколько я знаю (и я не специалист по NGINX), я не уверен, что это сильно помогает.

Рейтинг:4
флаг tz

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

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

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

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


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

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

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

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

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

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

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

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

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

Ни в коем случае не сказано, что эта директива добавляет ПОСЛЕДНЕЕ ИЗМЕНЕНИЕ переменная для SSI nginx.

ПОСЛЕДНЕЕ ИЗМЕНЕНИЕ надо еще поддерживать

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

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

Тангенс: даже если он поддерживается, если вы добавите ПОСЛЕДНЕЕ ИЗМЕНЕНИЕ, должно ли его значение быть отметкой времени сценария SSI или отметкой времени сервера; поскольку ответ HTML генерируется «на лету», а не считывается напрямую из файла.

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

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

Michael Hampton avatar
флаг cz
Не ожидайте, что это будет добавлено также. SSI — это давно мертвая технология, и я всегда удивляюсь, когда вижу, что кто-то пытается ее использовать. Я также был немного удивлен, что Игорь вообще добавил его в nginx в самом начале. Уже тогда это было мертво.
mforsetti avatar
флаг tz
Я действительно думаю, что SSI имел свое место в прошлом, особенно потому, что SSI достаточно прост в использовании, а CGI изначально не работал хорошо (здесь мы говорим о до 2000 года); хотя текущие уровни вычислительной мощности и динамики, которые могут быть обеспечены *GI (CGI, FastCGI, WSGI и т. д.), забили последний гвоздь в гроб SSI.
флаг cn
Хотя это может быть не так полностью реализовано, как в Apache, согласно документации NGIX (см. ссылку в моем посте), LAST_MODIFIED все еще должен поддерживаться, что является моим вопросом. Это для устаревших сайтов, которые я перешел на NGINX из Apache. Некоторые крупные сайты все еще используют SSI, и это полезный упрощенный подход, избегающий PHP и т. д.
mforsetti avatar
флаг tz
@DaveEveritt Я отредактировал свой ответ и добавил несколько деталей.
Michael Hampton avatar
флаг cz
@DaveEveritt Вы неправильно прочитали документы. Этот параметр управляет заголовком ответа Last-Modified, а не какой-либо директивой SSI. Что касается SSI, он должен был быть чрезвычайно легким, потому что это все, что мог обрабатывать 486 или Pentium, и при этом обслуживать веб-страницу за разумное (для 1990-х) время. У вас должно быть несколько невероятно «устаревших» сайтов.
флаг cn
Спасибо за разъяснения. С Apache LAST_MODIFIED давал либо дату последнего обновления файла, содержащего SSI, либо дату обновления включенного файла, что я сейчас получаю с JavaScript, поэтому вместо этого я буду продолжать использовать JS.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.