Шифрование ссылки в TV-параметре
Приветствую.
Есть задача: у меня на сайте с MODx Revo есть TV-параметр offsite, в который я прописываю адрес какого-либо сайта, например,
Шаблон вывода
Готов оплатить работу или купить готовое решение, ибо обыскался.
Есть задача: у меня на сайте с MODx Revo есть TV-параметр offsite, в который я прописываю адрес какого-либо сайта, например,
http://offsite.ru
Мне необходимо эту ссылку зашифровать и превратить во внутренний редирект, чтобы вместо адреса сайта показывался http://mysite.ru/goto/948f3hdc8d4k9fjf
или типа того.Шаблон вывода
<a href="[[*offsite]]" target="_blank" onclick="yaCounter.reachGoal('regOffic'); return true;">[[*offsite]]</a>
Нужно получить на выходе:<a href="http://mysite.ru/goto/948f3hdc8d4k9fjf" target="_blank" onclick="yaCounter.reachGoal('regOffic'); return true;">http://offsite.ru</a>
Плагин нашел только для Evo и то заброшенный судя по всему.Готов оплатить работу или купить готовое решение, ибо обыскался.
Комментарии: 9
Сделать несложно, можно даже без отдельной таблицы, чисто ТВ параметрами.
Например, пишем в ТВ
Затем выводим где нужно этот ТВ через фильтр вывода get_code:
В чанке оформления добавляем ссылку на редирект и выходит вот так:
И пишем плагин для OnPageNotFound:
Написал всё без проверки, это просто общий принцип. Можно сделать и более круто: со страницей в админке и таблицей код-ссылка.
Например, пишем в ТВ
948f3hdc8d4k9fjf==offsite.ru
Затем выводим где нужно этот ТВ через фильтр вывода get_code:
if (!empty($input) {
$tmp = explode('==', $input);
return $tmp[0];
}
В чанке оформления добавляем ссылку на редирект и выходит вот так:
<a href="http://mysite.com/goto/[[*link:get_code]]">Перейти по ссылке</a>
И пишем плагин для OnPageNotFound:
if ($modx->event->name != 'OnPageNotFound') {return;}
$tvid = '15'; // id ТВ со ссылками-кодами
if (preg_match('/goto/(.*)', $_SERVER['REQUEST_URI'], $matches) {
$code = $matches[1];
// Здесь ищем нужный тв по коду и выделяем ссылку
if ($tv = $modx->getObject('modTemplateVarResource', array('tmplvarid' => $tvid, 'value:LIKE' => "$code==%"))) {
$tmp = explode('==', $tv->get('value'));
// Редирект на адрес
$modx->sendRedirect('http://' . $tmp[1]);
}
}
Написал всё без проверки, это просто общий принцип. Можно сделать и более круто: со страницей в админке и таблицей код-ссылка.
Спасибо, Василий.
Не понял только как вписать в шаб
Не понял только как вписать в шаб
if (!empty($input) {
$tmp = explode('==', $input);
return $tmp[0];
}
Прочитал. Если правильно понял — создал снипет с кодом
Не заработало. Вижу только в консоли браузера 500-я ошибка.
if (!empty($input) {
$tmp = explode('==', $input);
return $tmp[0];
}
Назвал его getCrypto и в шаблоне вызывал /goto/[[*offsite:getCrypto]]Не заработало. Вижу только в консоли браузера 500-я ошибка.
Ну ты хоть количество скобок посчитай на первой строчке.
Я ж без проверки писал — исправляй.
Я ж без проверки писал — исправляй.
Визуально работает, но не редиректит. В коде плагина тоже скобочку добавил. Но на 404-ю на моем сайте кидает
Можно использовать обратимое шифрование.
1. Сниппет getCrypto (фильтр вывода для шифрование адреса сайта):
2. Создаем страничку site.ru/goto/ и на ней помещяем НЕкешируемый вызов сниппета sendCriptoRedirect:
В итоге первый сниппет будет зашифровывать, а второй расшифровывать и редиректить.
Код взят отсюда: webformyself.com/shifrovanie-dannyx-na-php/
1. Сниппет getCrypto (фильтр вывода для шифрование адреса сайта):
$key = "qie1GllccDadnmZvhpcM0WK18vfVScxBKeM";
$str = $input;
//открываем модуль шифрования и получаем его дискриптор
$td = mcrypt_module_open(MCRYPT_BLOWFISH,'',MCRYPT_MODE_CFB,'');
// получаем размер вектора шифрования на основе дискриптора.
$iv_size = mcrypt_enc_get_iv_size($td);
// Создание вектора шифрования
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
// открытие буфера обмена обмена для шифровки данных
mcrypt_generic_init($td,$key,$iv);
// шифруем даные
$crypt_text = mcrypt_generic($td,$str);
// закрываем буфер обмена и модуль
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return 'goto/?code='.base64_encode($iv.$crypt_text);
2. Создаем страничку site.ru/goto/ и на ней помещяем НЕкешируемый вызов сниппета sendCriptoRedirect:
if (!$_GET['code']) return;
$key = "qie1GllccDadnmZvhpcM0WK18vfVScxBKeM";
$code = base64_decode($_GET['code']);
$td = mcrypt_module_open(MCRYPT_BLOWFISH,'',MCRYPT_MODE_CFB,'');
$iv_size = mcrypt_enc_get_iv_size($td);
$iv = substr($code,0,$iv_size);
$crypt_text = substr($code,$iv_size);
mcrypt_generic_init($td,$key,$iv);
$url = mdecrypt_generic($td,$crypt_text);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
$modx->sendRedirect($url);
В итоге первый сниппет будет зашифровывать, а второй расшифровывать и редиректить.
Код взят отсюда: webformyself.com/shifrovanie-dannyx-na-php/
Здравствуйте, Илья.
Я сделала все по той инструкции, где начинается ваш ответ modx.pro/help/3246/#comment-25516.
Ссылки шифруются, но при переходе по зашифрованным ссылкам, сайт выдает ошибку 500.
С чем это может быть связано и как можно решить? Вы можете помочь?
Заранее спасибо!
Я сделала все по той инструкции, где начинается ваш ответ modx.pro/help/3246/#comment-25516.
Ссылки шифруются, но при переходе по зашифрованным ссылкам, сайт выдает ошибку 500.
С чем это может быть связано и как можно решить? Вы можете помочь?
Заранее спасибо!
Решено. Работает.
Подытожу:
Сниппет getCrypto создаем.
Далее сниппет sendCriptoRedirect создаем.
В шаблоне пишем, где offsite — это название моего ТВ параметра, куда помещаю URL.
Подытожу:
Сниппет getCrypto создаем.
Далее сниппет sendCriptoRedirect создаем.
В шаблоне пишем, где offsite — это название моего ТВ параметра, куда помещаю URL.
<a href="http://mysite.ru/[[*offsite:getCrypto]]" target="_blank" onclick="yaCounter2223334.reachGoal('regOffic'); return true;">[[*offsite]]</a>
Создаю страницу Goto с шаблоно «Пустой», где отключаю кэширование на вкладке «Настройки» и в поле «Заморозить URI» прописываю «goto/», а в поле «Содержимое ресурса» вызываю сниппет [[sendCriptoRedirect]]
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.