Добрый день всем!
В общем проблема такая. Сервер отдает Last modified дату и время последнего сброса кеша... для всех страниц. Как корректно настроить, чтобы в заголовке отдавал реальную дату модификации?
И еще, как откорректировать такой ответ: expires: Sun, 19 Nov 1978 05:00:00 GMT
Drupal 9.5.11
Комментарии
Реальную дату модификации чего? Если страница содержит ноду, пару вьюх и футер, в котором позавчера поменялся телефон компании?
Ноды конечно, ведь это адрес ноды, все остальные объекты тут лишь вставные.
У меня сейчас на всех 15 тысячах страниц Last-modified кеша, это не правильно.
Это смотрели?
https://drupal-coder.ru/blog/pravilnye-otvety-servera-dlya-uskoreniya-in...
https://www.drupal.org/project/lastmodified_since
Если честно не помню, но возможно это тоже содержит решение https://www.drupal.org/project/http_response_headers
Увы... ничего из выше перечисленного не помогает. Более того модуля lastmodified_since больше нет. Вернее если покопаться можно скачать для D8 ...путем нехитрых манипуляций я его на D9 запустил. И он работает, но все, что он сделал, это стал отдавать 304 ...но сравнивает он все равно со временем кеша.
Как отдать дату и время последнего редактирования ноды в Last Modified, а не кеша...
На днях добавлял Last Modified для Drupal 8.7. Может поможет.
В своем модуле:
Файл: MY_MODULE.services.yml
class: Drupal\MY_MODULE\EventSubscriber\Subscriber
arguments: ['@config.factory']
tags:
- { name: event_subscriber }
Файл: src/EventSubscriber/Subscriber.php
<?php
/**
// надо посмотреть в объекте $response, через него можно получить ноду и нужную дату.
// Добавляем заголовок
namespace Drupal\MY_MODULE\EventSubscriber;
use
Symfony\Component\HttpKernel\KernelEvents;use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class
Subscriber implements EventSubscriberInterface {* Executes actions on the respose event.
*
* @param \Symfony\Component\HttpKernel\Event\FilterResponseEvent $event
* Filter Response Event object.
*/
public function onKernelResponse(FilterResponseEvent $event) {
$response = $event->getResponse();
// вместо time() будет нужная вам дата
$time = time();// Форматируем дату
$lastModifiedDate = date('D, d M Y G:i:s', $time);
$response->headers->set('Last-Modified', $lastModifiedDate . ' GMT');
}
public static function
getSubscribedEvents() {// -10 это приоритет вызова, с ним можно поиграть при надобности
$events[KernelEvents::RESPONSE][] = ['onKernelResponse', -10];
return $events;
}
}
?>Сорян, что код разъехался, чет не смог подправить)
Всем привет!
Подниму тему. Кто-то в 10 ветка разбирался с 'Last-Modified' ?
Не могу вывести.
В комментарии выше FilterResponseEvent - устаревший. Для 10 нужно менять на Symfony\Component\HttpKernel\Event\ResponseEvent
код
<?php $response->headers->set('Last-Modified', $lastModifiedDate . ' GMT'); ?>
Работает и добавляет данные в $response->headers, но его нет в ответе при проверка в яндексе webmaster.yandex.ru/tools/server-response и тут lastmodified.ruЧего удалось добиться, так это выводить 304 при запросе If-Modified-Since.
<?php
public function onKernelResponse(ResponseEvent $event) {
if($node = \Drupal::routeMatch()->getParameter('node')){
$node_update = $node->getChangedTime();
$response = $event->getResponse();
$response->setLastModified(new \DateTime(gmdate(DateTimePlus::RFC7231, $node_update)));
}
} ?>
А сам заголовок "Last-Modified" нет.
...патчить ядро желания нет.
Разобрался. Нужно было отключить на сервере SII для домена. Drupal тут ни причем.
Выше в моем комменте работающий код.