Как трекинг в MailWizz съел слеш и не только


Продолжаются мои эксперименты с рассылкой, в результате которых я набрёл на проблему — трекинг не работал, как надо. Есть подозрения, что это общее место.

Начну с небольшого предисловия. Заказывали мы недавно рассылку по большой базе и получили в итоге ноль, такой большой и жирный. По итогам исполнитель, который вроде собаку съел на рассылках, прислал даже отчеты: кто прочитал и кликнул, кто отписался, до кого почта не дошла по техническим причинам. У меня же в линки были встроены utm-метки, то есть если бы люди кликали, то я бы их увидел в Google Analytics и Яндекс.Метрике. И я их даже потом увидел, но на пару порядков меньше, и самое главное со странным пользовательским поведением — смотрят 1 странуцу, 100% отказов, время на сайте 0 минут 0 секунд. И я даже догадываюсь в чем дело было. Люди кликали, попадали на редирект и … попадали в яму, с которой столкнулся и я, когда настраивал свою систему рассылки.

Эксперты рекомендуют разносить сервер рассылщик (PowerMTA, например) и сервер управления рассылками (MailWizz, например). Чтобы, если ваш сервер-рассылщик настигнет ненастье, то данные все сохранятся. Ещё умные люди советуют, чтобы в письме, которое идет SMTP сервера, ссылки вели бы на тот же домен, на котором он располагается. Т.е. есть хост snd.domain.com, с него уходят письма в которых ссылки имеют вид https://domain.com/komu-na-rusi-zhit-horosho/ можно и на поддомен ссылаться, например, https://www.domain.com или https://cdn.domain.com Всё здорово, но как мониторить переходы, открытия, …? Эксперты из MailWizz советуют сделать для домена domain.com запись в DNS: cdn.domain.com. CNAME app.example.com. 3600, где app.example.com — это хост, где и сидит система управления рассылками.

Кликая на ссылку вида https://cdn.domain.com/page123/ вы будете автоматически попадать на https://app.example.com/page123/.

В идеале, я так понимаю, app.example.com лучше располагать даже за CloudFlare, мол это дает защиту от антиспам роботов, которые пытаются пройти до целевой страницы и не могут. Другие эксперты говорят, могут, всё могут… Но не важно, главное хоть какие-то правила игры соблюсти.

Логика работы всего этого награмождения в следующем.

У вас письмо, в нем ссылка на www.super-puper-product.com/oversome-baida/. MailWizz перепаковывает все такую ссылку в новый вид — https://cdn.domain.com/traking-code-1x2y3z/. Человек получает письмо с domain.com с такой ссылкой, кликает по ней, браузер понимает, что настоящий домен app.example.com и делает запрос по адресу https://app.example.com/traking-code-1x2y3z/.

MailWizz знает, что traking-code-1x2y3z — это в реальности https://www.super-puper-product.com/oversome-baida/ перенаправляет пользователя на целевую страницу, одновременно учитывая его в своей статистике.

Все чудесно в теории :). На практике первый затык в том, что на этапе подмены домена по CNAME браузер говорит: «Вах-Вах нехороший человек хочет тебя нагреть — нужет сертификат cdn.domain.com, а в наличии сертификат app.example.com. Как результат — посетитель потерян, ибо никто решать ваши проблемы не будет.

Выход нашелся в том, чтобы MailWizz использовал для ссылок http. Тогда вопросов о несовпадении сертификатов не будет. Нет сертификата — нет проблем.

Но сайт-то упправления app.example.com плохо держать на http. А и не надо. Надо редирект у Apache2/Nginx сделать для всех входящих по http на https.

Сказано — сделано. Вернее все было сделано ещё ранее. Вот только эффект оказался неожиданным.

Ссылка http://cdn.domain.com/traking-code-1x2y3z/ неожиданно превращалась в https://app.example.comtraking-code-1x2y3z/

Я выпал в аут. Это сейчас понятно, что проблема была в редиректе с http на https, а сначала концов видно не было. Гуглил до посинения, пока не задал правильный вопрос и не получил хороший ответ.

Вместо файла вируального хоста такого вида (у меня Apache2):

<VirtualHost *:80>
    ServerName app.example.com
    Redirect / https://app.example.com
</VirtualHost>

<VirtualHost _default_:443>
    ServerName app.example.com
    DocumentRoot /var/www/html

    SSLEngine on
    SSLCertificateChainFile /etc/letsencrypt/live/app.example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/app.example.com/privkey.pem
    SSLCertificateFile /etc/letsencrypt/live/app.example.com/cert.pem

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

надо сделать такой файл:

<VirtualHost *:80>
    ServerName app.example.com
    RedirectMatch permanent /(.*) https://app.example.com/$1
</VirtualHost>

<VirtualHost _default_:443>
    ServerName app.example.com
    DocumentRoot /var/www/html

    SSLEngine on
    SSLCertificateChainFile /etc/letsencrypt/live/app.example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/app.example.com/privkey.pem
    SSLCertificateFile /etc/letsencrypt/live/app.example.com/cert.pem

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

После этого слэш перестал пропадать. Ссылка https://app.example.com/traking-code-1x2y3z/ системой транслируется в www.super-puper-product.com/oversome-baida/ и человек попадает на нужную страницу (http или https она — не важно).

Итого. Важно.

  1. В MailWizz для трекинг сервера выставить транспорт http
  2. Прописать нужный редирект в файле виртуального хоста.

Примечание: в процессе борьбы с проблемой поставил себе на domain.com wildcard сертификат Let’s encrypt, но он вроде автоматом не обновляется и выдается на 90 дней. Это была идея получить сертификат и на фейковый домен cdn. надо проверить, может я зря это сделал 🙂 и простого достаточно.

UPD. Простого сертификата достаточно.