LastModified и Office
Столкнулся с прoблемой компонента LastModified и Office. При включённом плагине перестаёт корректно работать авторизация. После ввода данных и нажатии на кнопку Вход не происходит смены чанков с не авторизованного на авторизованный и также с выходом. Ты вроде вышел, а отображается твоя учётка. При обновлении кэша браузера через CTRL + F5 всё нормально отображается. Может кто-нибудь подсказать как можно плагин допилить, чтобы сниппет Office не кэшировался?
<?php
/**
* MODx Revolution plugin which handle request If-Modified-Since
*
* @package lastmodified
* @var modX $modx MODX instance
* @var integer $dtm Value of last update time of document
* @var integer $ltm Value of HTTP_IF_MODIFIED_SINCE from request
* @var string $rule Cache-control directive (public, private)
* @var integer $maxage Cache max age in seconds
* @var integer $expire Cache expire in seconds
*/
if ($modx->event->name == 'OnWebPagePrerender') {
$dtm = ($modx->resource->get('editedon')) ? strtotime($modx->resource->get('editedon')) : strtotime($modx->resource->get('createdon'));
if (empty($dtm)) {
return '';
}
$rule = trim($modx->getOption('lastmodified.response'));
if (!in_array($rule, ['private', 'public'])) { // 'no-cache'
$modx->log(xPDO::LOG_LEVEL_ERROR, 'LastModified: wrong response directive value. Check configuration.');
return '';
}
$maxage = ((int)$modx->getOption('lastmodified.maxage') > 0) ? (int)$modx->getOption('lastmodified.maxage') : 3600;
$expire = ((int)$modx->getOption('lastmodified.expires') > 0) ? (int)$modx->getOption('lastmodified.expires') : 3600;
if (!empty($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
$ltm = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']);
if ($dtm <= $ltm) {
$protocol = isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1';
header($protocol . ' 304 Not Modified');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $dtm) . ' GMT');
header('Cache-control: ' . $rule . ', max-age=' . $maxage);
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $expire));
exit();
}
}
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $dtm) . ' GMT');
header('Cache-control: ' . $rule . ', max-age=' . $maxage);
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $expire));
return '';
}
/**
* Update parent editedon field
*
* @var modX $modx MODX instance
* @var modResource $parent Parent resource object
*/
if ($modx->event->name == 'OnDocFormSave') {
if ($modx->getOption('lastmodified.update_start')) {
$mainId = $modx->getOption('site_start');
if ($mainId > 0 && $mainId !== $id) {
$main = $modx->getObject('modResource', $mainId);
if (!$main instanceof modResource) {
$modx->log(xPDO::LOG_LEVEL_ERROR, 'LastModified: get wrong modResource instance for main page with id ' . $mainId . ' for document ' . $id. '.');
return '';
}
$main->set('editedon', time());
$main->save();
unset($main);
}
unset($mainId);
}
if ($modx->getOption('lastmodified.update_parent')) {
$level = ((int)$modx->getOption('lastmodified.update_level') > 0) ? (int)$modx->getOption('lastmodified.update_level') : 1;
$parentIds = $modx->getParentIds($id, $level, ['context' => 'web']);
foreach ($parentIds as $parentId) {
if ($parentId === 0) {
continue;
}
$parent = $modx->getObject('modResource', $parentId);
if (!$parent instanceof modResource) {
$modx->log(xPDO::LOG_LEVEL_ERROR, 'LastModified: get wrong modResource instance for parent with id ' . $parentId . ' for document ' . $id. '.');
return '';
}
$parent->set('editedon', time());
$parent->save();
unset($parent);
}
return '';
}
} Комментарии: 48
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Удалось допилить LastModified?
SEQUEL.ONE посмотрите пожалуйста, выпустил вариант с предотвращение обработки для авторизованных пользователей. В теории, должно решить Вашу проблему.
Попробуйте обновить компонент и отписаться здесь по результатам, если не сложно :)
Если Вы под словом SSL подразумеваете защищенное https соединение, то компонент вообще не смотрим, есть ли защищенное соединение или нет, ему все равно. Он просто анализирует дату последнего изменения документа и если она совпадает с датой в запросе, отдает 304 заголовок и умирает, потому что отдавать контент смысла нет.
Пример работы компонента с https соединением на скриншоте:
Каких-то дополнительных настроек компонент не требует, насколько я помню :)
на следующий код
и результат из логов сбросить сюда. В логах должно будет отразиться похожее на:
int(1552381472)
int(1552381432)
на:
И все что выведется в логах разместите пожалуйста здесь.
$modx->log(modX::LOG_LEVEL_ERROR, 'In plugin');
int(1552382843)
В WWW-домены у сайта сервер какой подключен? Apache, CGI или FastCGI?
Я сейчас посмотрю как у меня настроено, я вроде бы какие-то дополнительные правки вносил. А сжатие выставляли в WWW-доменах?
Пробую сейчас поковырять сам плагин.
После этого заработало. Но пытаюсь с идентичными настройками на другом домене воспроизвести, так ничего пока не вышло. Сижу ковыряюсь)))
В плагине сейчас принудительно отключается любая обработка 304 заголовков для авторизованных пользователей (кстати, спасибо за эту идею :) ), плюс можно принудительно запретить обработку если в сессиии встречается какая-то переменная. Для пакета Office она так и будет называться, просто в настройках обновленной версии в prevent_session прописываете office и все, перестанет обрабатываться.
Ума не приложу как его завести((( Похоже придётся поочерёдно все плагины по-выключать.
на:
То есть он после каждого условия пишет в лог на уровне ошибки, прошел он по условию или нет. После чего еще и логирует дату документа. Очень удобно бывает посмотреть :)
P.S. Мне кажется, вы просто под зарегистрированным юзером тестируете, а теперь он по умолчанию не отрабатывает для зарегистрированных. Так же он не будет отрабатывать, если minishop2 стоит. В настройках выключите prevent_authorized и prevent_session поле очистите и посмотрите, будет ли работать.
sequel.one/extras/verify/