Если Изменено После Http-Заголовка

  • Автор темы Busol
  • Обновлено
  • 22, Oct 2024
  • #1

Я пытаюсь включить

 304 If Modified Since HTTP header 
in my WordPress site. After doing lot of Googling I find out a site where the author said to put the following line at the very end of wordpress get_the_modified_date() файл. Вот строка кода:

the_modified_date()

Вот автор сказал, что это все. Мне не нужно делать что-либо еще, чтобы достичь 304 If Modified Since HTTP header . But after doing this I tested by HTTP header using the site

http://httpstatus.io/

и вот скриншот моего заголовка:

Если изменено после HTTP-заголовка

Проверьте раздел, отмеченный красным. Последнее измененное значение заголовка — ПУСТОЕ.

После этого я подумал, что это может быть какая-то проблема с header("Last-Modified: " . the_modified_date()); function so I've also tried wp-config.php функция. Но результата все равно нет.

В самом конце я создал небольшую функцию короткого кода, чтобы проверить, работают ли эти функции или нет, и повторил ее внутри короткого кода. Когда я использовал короткий код, я ясно видел, что функции работают нормально, но по какой-то причине отправляются пустые данные в 304 If Modified Since HTTP header .

Мой сайт здесь

Любые предложения о том, как это решить?

#заголовки #http

Busol


Рег
11 Dec, 2003

Тем
88

Постов
202

Баллов
682
  • 25, Oct 2024
  • #2

 
 
 
 add_action('template_redirect', 'last_mod_header');

function last_mod_header($headers) {

if( is_singular() ) {

$post_id = get_queried_object_id();

$LastModified = gmdate("D, d M Y H:i:s \G\M\T", $post_id);

$LastModified_unix = gmdate("D, d M Y H:i:s \G\M\T", $post_id);

$IfModifiedSince = false;

if( $post_id ) {

if (isset($_ENV['HTTP_IF_MODIFIED_SINCE']))

$IfModifiedSince = strtotime(substr($_ENV['HTTP_IF_MODIFIED_SINCE'], 5));  

if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']))

$IfModifiedSince = strtotime(substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 5));

if ($IfModifiedSince && $IfModifiedSince >= $LastModified_unix) {

header($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified');

exit;

} 

header("Last-Modified: " . get_the_modified_time("D, d M Y H:i:s", $post_id) );

}

}

}
 
is a template tag that must used inside the loop, that is why it is not wokring for you.

WordPress предоставляет действие и фильтр для включения или изменения заголовков HTTP:

Но для этой цели это не годится. Например, следующий код не работает:

template_redirect

Почему?

Основной запрос wp в данный момент не создается ни в NULL filter. So, get_queried_object_id() возвращает false , is_singular() возвращает wp_headers and there is no way to get the modified time of the current post.

Возможным решением является использование add_action( 'send_headers', 'cyb_add_last_modified_header' ); function cyb_add_last_modified_header() { //Check if we are in a single post of any type (archive pages has not modified date) if( is_singular() ) { $post_id = get_queried_object_id(); if( $post_id ) { header("Last-Modified: " . get_the_modified_time("D, d M Y H:i:s", $post_id) ); } } } крючок действия, как предложил Отто в этот вопрос (проверено и работает):

wp_headers ||answer||

Я попробовал код из Cybmeta но дата была установлена ​​неправильно. Я не совсем уверен в причине, но после расследования я нашел Добавить заголовки плагин, который сейчас устарел, но был хорошим источником полезного кода. В этом плагине автор устанавливает дату заголовка Last-Modified по-другому и использует ее для изменения кода, который работал у меня. Вот что у меня получилось:

send_headers ||answer||

Мое решение для Последнее изменение и правильно 304 Не изменено

Внутри функций.php

the_modified_date()
 

LoneWolf666


Рег
29 Jul, 2006

Тем
63

Постов
180

Баллов
505
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно