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

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

С нами с 25 июля 2016; Место в рейтинге пользователей: #92
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 посмотрите пожалуйста, выпустил вариант с предотвращение обработки для авторизованных пользователей. В теории, должно решить Вашу проблему.