Кудашев Сергей

Кудашев Сергей

С нами с 25 июля 2016; Место в рейтинге пользователей: #74
Кудашев Сергей
21 сентября 2019, 09:40
+1
Смотрю на то как развиваются события. Если так дальше будет продолжаться, то Revo все таки помрет. Если Evo переживет старшего брата и вернет популярность MODX это будет приятный сюрприз. @Dmytro Lukianenko правильное дело делаете :) Удачи!
Кудашев Сергей
13 марта 2019, 01:08
0
Значит работает как задумано :)
Кудашев Сергей
13 марта 2019, 01:04
0
Ну вообще проще всего отлаживать заменяя начало кода плагина:
if ($modx->event->name == 'OnWebPagePrerender') {
    if ($modx->getOption('lastmodified.prevent_authorized') && ($modx->user->get('username') !== '(anonymous)')) {
        return '';
    }

    if (!empty($modx->getOption('lastmodified.prevent_session'))) {
        $prevent = array_map(function ($s) {return strtolower(trim($s));}, explode(',', $modx->getOption('lastmodified.prevent_session')));
        if (empty($prevent)) {
            $modx->log(xPDO::LOG_LEVEL_ERROR, 'LastModified: incorrect prevent session list. Check configuration.');
            return '';
        }

        $sessionkeys = array_map(function ($s) {return strtolower(trim($s));}, array_keys($_SESSION));

        if (array_intersect($prevent, $sessionkeys)) {
            return '';
        }
    }

    $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 '';
    }
на:
if ($modx->event->name == 'OnWebPagePrerender') {
    $modx->log(modX::LOG_LEVEL_ERROR, 'In plugin');
    if ($modx->getOption('lastmodified.prevent_authorized') && ($modx->user->get('username') !== '(anonymous)')) {
        return '';
    }
    $modx->log(modX::LOG_LEVEL_ERROR, 'After authorized');
    if (!empty($modx->getOption('lastmodified.prevent_session'))) {
        $prevent = array_map(function ($s) {return strtolower(trim($s));}, explode(',', $modx->getOption('lastmodified.prevent_session')));
        if (empty($prevent)) {
            $modx->log(xPDO::LOG_LEVEL_ERROR, 'LastModified: incorrect prevent session list. Check configuration.');
            return '';
        }

        $sessionkeys = array_map(function ($s) {return strtolower(trim($s));}, array_keys($_SESSION));

        if (array_intersect($prevent, $sessionkeys)) {
            return '';
        }
    }
    $modx->log(modX::LOG_LEVEL_ERROR, 'After prevent');
    $dtm = $modx->resource->get('editedon') ? strtotime($modx->resource->get('editedon')) : strtotime($modx->resource->get('createdon'));
    if (empty($dtm)) {
        return '';
    }
ob_start();
var_dump($dtm);
$contents = ob_get_contents();
ob_end_clean();
error_log(print_r($contents,1), 3, $modx->getOption(xPDO::OPT_CACHE_PATH).'logs/error.log');
    $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 '';
    }
    $modx->log(modX::LOG_LEVEL_ERROR, 'After check');
То есть он после каждого условия пишет в лог на уровне ошибки, прошел он по условию или нет. После чего еще и логирует дату документа. Очень удобно бывает посмотреть :)

P.S. Мне кажется, вы просто под зарегистрированным юзером тестируете, а теперь он по умолчанию не отрабатывает для зарегистрированных. Так же он не будет отрабатывать, если minishop2 стоит. В настройках выключите prevent_authorized и prevent_session поле очистите и посмотрите, будет ли работать.
Кудашев Сергей
12 марта 2019, 18:54
+1
Ну если что вдруг не заработает или еще какое-то странное поведение, пишите :)

В плагине сейчас принудительно отключается любая обработка 304 заголовков для авторизованных пользователей (кстати, спасибо за эту идею :) ), плюс можно принудительно запретить обработку если в сессиии встречается какая-то переменная. Для пакета Office она так и будет называться, просто в настройках обновленной версии в prevent_session прописываете office и все, перестанет обрабатываться.
Кудашев Сергей
12 марта 2019, 18:49
0
@Василий Наумкин Как то странно работает для некоторый пользователей, например начинаю поиск по «Илья Александрович», в выпадающем списке он появляется, выбираю его и вместо пользователя в редакторе получается вот такая вещь (она же остается в таком виде и после сохранения): @Илья Александрович@gmail.com

Ссылка на пользователя не активна, уведомления скорее всего не уходят. Мне кажется это связано с почтой в имени.
Кудашев Сергей
12 марта 2019, 18:37
+1
@Илья Александрович@gmail.com Вы обновились, проблема решилась? Или так и остался косяк с корзины?
Кудашев Сергей
12 марта 2019, 18:36
0
SEQUEL.ONE Вы обновились, проблема решилась? Или так и остался косяк с кешированием?
Кудашев Сергей
12 марта 2019, 16:09
0
Потому что в целях безопасности рекомендуется отключать показ X-Powered-By в настройках MODX.
Кудашев Сергей
12 марта 2019, 14:45
0
Сергей, не хотите доступ давать к рабочему проекту, не проблема. Сделайте чистый проект на этом хостинге и пришлите доступ. Я так понимаю дело в любом случае в хостинге и хотелось бы сначала исключить какую-то «особенную» работу плагина, а потом уже развлекаться с настройками. Вы так меньше времени потеряете :)
Кудашев Сергей
12 марта 2019, 13:14
0
А Вы на 7.1 или 7.0 не пробовали переключать? Вообще под 7.2 не всегда все в MODX корректно работает, по моим наблюдениям.
Кудашев Сергей
12 марта 2019, 13:13
0
Сергей, у меня не так много времени есть, и если мы так с Вами дальше пойдем, то это очень надолго затянется. Если есть возможность отправьте пожалуйста доступ к админке на почту мою: kudashevs@gmail.com, мне будет проще так разобраться чем тут переписываться. Можете пароли поменять перед и после, поверьте мне не особо интересно что у Вас там :)
Кудашев Сергей
12 марта 2019, 12:48
0
Отлично тогда возвращаем все как было и меняем верхнюю часть:
if ($modx->event->name == 'OnWebPagePrerender') {
    if ($modx->getOption('lastmodified.prevent_authorized') && ($modx->user->get('username') !== '(anonymous)')) {
        return '';
    }

    if (!empty($modx->getOption('lastmodified.prevent_session'))) {
        $prevent = array_map(function ($s) {return strtolower(trim($s));}, explode(',', $modx->getOption('lastmodified.prevent_session')));
        if (empty($prevent)) {
            $modx->log(xPDO::LOG_LEVEL_ERROR, 'LastModified: incorrect prevent session list. Check configuration.');
            return '';
        }

        $sessionkeys = array_map(function ($s) {return strtolower(trim($s));}, array_keys($_SESSION));

        if (array_intersect($prevent, $sessionkeys)) {
            return '';
        }
    }

    $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 '';
    }
на:
if ($modx->event->name == 'OnWebPagePrerender') {
    $modx->log(modX::LOG_LEVEL_ERROR, 'In plugin');
    if ($modx->getOption('lastmodified.prevent_authorized') && ($modx->user->get('username') !== '(anonymous)')) {
        return '';
    }
    $modx->log(modX::LOG_LEVEL_ERROR, 'After authorized');
    if (!empty($modx->getOption('lastmodified.prevent_session'))) {
        $prevent = array_map(function ($s) {return strtolower(trim($s));}, explode(',', $modx->getOption('lastmodified.prevent_session')));
        if (empty($prevent)) {
            $modx->log(xPDO::LOG_LEVEL_ERROR, 'LastModified: incorrect prevent session list. Check configuration.');
            return '';
        }

        $sessionkeys = array_map(function ($s) {return strtolower(trim($s));}, array_keys($_SESSION));

        if (array_intersect($prevent, $sessionkeys)) {
            return '';
        }
    }
    $modx->log(modX::LOG_LEVEL_ERROR, 'After prevent');
    $dtm = $modx->resource->get('editedon') ? strtotime($modx->resource->get('editedon')) : strtotime($modx->resource->get('createdon'));
    if (empty($dtm)) {
        return '';
    }
ob_start();
var_dump($dtm);
$contents = ob_get_contents();
ob_end_clean();
error_log(print_r($contents."\n",1), 3, $modx->getOption(xPDO::OPT_CACHE_PATH).'logs/error.log');
    $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 '';
    }
    $modx->log(modX::LOG_LEVEL_ERROR, 'After check');
И все что выведется в логах разместите пожалуйста здесь.
Кудашев Сергей
12 марта 2019, 12:19
0
Можете в плагине заменить
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();
        }
    }
на следующий код
if (!empty($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
        $ltm = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']);
        ob_start();
var_dump($ltm);
var_dump($dtm);
$contents = ob_get_contents();
ob_end_clean();
error_log(print_r($contents."\n",1), 3, $modx->getOption(xPDO::OPT_CACHE_PATH).'logs/error.log');
        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();
        }
    }
и результат из логов сбросить сюда. В логах должно будет отразиться похожее на:
int(1552381472)
int(1552381432)
Кудашев Сергей
12 марта 2019, 11:57
0
Тогда попробуйте и можете сюда скинуть скрины для http и для https, и левую и правую части того, что выводит last-modified.com.
Кудашев Сергей
12 марта 2019, 11:52
0
А он именно на https не отдает или не http тоже не отдает?
Кудашев Сергей
12 марта 2019, 11:46
0
Компонент работает из коробки. Никаких сложностей с установкой быть не должно.
Каких-то дополнительных настроек компонент не требует, насколько я помню :)
Кудашев Сергей
12 марта 2019, 11:31
0
Сергей, хотелось бы более развернутого комментария и каких нибудь подтверждений, что значит не работает?

Если Вы под словом SSL подразумеваете защищенное https соединение, то компонент вообще не смотрим, есть ли защищенное соединение или нет, ему все равно. Он просто анализирует дату последнего изменения документа и если она совпадает с датой в запросе, отдает 304 заголовок и умирает, потому что отдавать контент смысла нет.

Пример работы компонента с https соединением на скриншоте:
Кудашев Сергей
12 марта 2019, 03:26
0
Если правильно понял причину проблемы, то необходимые правки внес. Добавил дополнительный параметр, который предупреждает обработку If-Modified-Since в случае, если в именах переменных сессии встречаются определенные названия. В нашем случае это minishop2, о сделан настройкой по умолчанию.

Попробуйте обновить компонент и отписаться здесь по результатам, если не сложно :)
Кудашев Сергей
12 марта 2019, 00:37
0
Илья Александрович к сожалению плотно не работал с miniShop2, не было такой необходимости. Сегодня посмотрю что можно с этой проблемой сделать.
Кудашев Сергей
12 марта 2019, 00:36
+1
Господа, как автор плагина, хочу обратить ваше внимание, что с проблемами лучше писать в личку или на github.

SEQUEL.ONE посмотрите пожалуйста, выпустил вариант с предотвращение обработки для авторизованных пользователей. В теории, должно решить Вашу проблему.