<rmcreative>

RSS

Как Facebook подменяет ссылки

24 мая 2012

Наткнулся на занятную особенность Facebook. А именно на то, как он работает со ссылками.

Для проекта потребовалось реализовать систему приглашений. Схема стандартная:

  1. Генерируем уникальный хеш.
  2. Подставляем к основному URL.
  3. Посылаем через сообщение Facebook.
  4. Получивший сообщение пользователь идёт по ссылке с хешем и видит своё приглашение.

В процессе тестирования вроде-бы простой схемы выяснилось интересное: на шаге №4 пользователь получал сообщение без хеша.

Первое подозрение пало на параметр, передаваемый GET-ом. Сделали частью URL и… не помогло, что сильно удивило и озадачило. Через несколько дней копаний оказалось, что при отправке сообщения:

  1. Facebook идёт по ссылке в сообщении.
  2. Парсит страницу и берёт из неё тег <meta property="og:url" content="http://example.com/content/my-stuff" />. Хеша для приглашения у нас в этом URL, конечно, не было.
  3. Подменяет ссылку, которая была в сообщении, на ту, что была получена из метатега.

Отсюда выводы:

  1. При работе с Facebook помните про особые метатеги.
  2. Никогда не меняйте состояние приложения через GET.

Комментарии RSS

  1. №6237
    Alinaki
    Alinaki 24.05.2012, 23:56:45

    GET-запросы - идемпотентны по рекомендациям стандарта. Нефиг с их помощью менять состояние приложения вообще.

  2. №6238
    Sam
    Sam 25.05.2012, 1:08:32

    Alinaki, про GET я, в общем, как напоминание. У нас там форма с кнопкой.

  3. №6240
    Zhdan
    Zhdan 25.05.2012, 7:22:27

    С лайками вроде такая же история. Есть ещё такой инструмент - developers.facebook.com/tools/debug Сейчас не знаю, но раньше тулза показывала как ФБ видит страницу.

  4. №6242
    Diolektor
    Diolektor 25.05.2012, 8:56:56

    С одноклассниками также история у меня была. Нельзя было поделиться юзеру реферальной ссылкой, одноклассники реф вырезали

  5. №6253
    Grigori
    Grigori 28.05.2012, 17:45:22

    а meta refresh оно обрабатывает?

  6. №6256
    Sam
    Sam 29.05.2012, 13:24:27

    Кто оно? Facebook? Не знаю.

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.