Ответ 1
Я работаю в предположении, что вы понимаете, что теги og должны отображаться на сервере (т.е. они не требуют JS, если вы используете источник просмотра, они все еще должны быть там).
Рендеринг на стороне сервера
Ваш первый и лучший вариант - использовать рендеринг на стороне сервера для вставки метатегов og при загрузке страницы. Чтобы сделать это, вам нужно переключиться на маршрутизацию HTML5 (pushState/replaceState) вместо hashbang (#!
), так как хеш не читается через сервер. Затем вы должны продублировать свои маршруты для страниц, для которых вы хотите иметь метатеги, и обслуживать свое приложение так же, как в настоящее время, только с предварительно заполненными метатегами.
Явная ссылка для совместного использования
В качестве альтернативы вы можете указать, чтобы ваши кнопки общего доступа указывали на кнопки общего доступа ссылку, указывающую на страницу, на которой нет ничего, кроме мета-тегов и перенаправления.
Например, кнопка "Поделиться":
<div id="fb-root"></div>
<script async defer crossorigin="anonymous" src="https://connect.facebook.net/en_US/sdk.js#xfbml=1&version=v4.0"></script>
<div class="fb-share-button" data-href="#" onclick="location.href='https://example.com/articles/some-article/share'; return false;" data-layout="button" data-size="small"><a target="_blank" href="#" onclick="location.href='https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fexample.com%2Farticles%2Fsome-article%2Fshare&src=sdkpreparse'; return false;" class="fb-xfbml-parse-ignore">Share</a></div>
(согласно документации Facebook, но этот подход теоретически будет работать с любым социальным сервисом)
с критическими битами, являющимися атрибутом data-href
и параметром строки запроса u
атрибута href
. Эта страница будет выглядеть следующим образом:
<!html>
<meta property="og:title" content="page title">
<script>
document.location.href = 'https://example.com/articles/some-article'
</script>
</html>
Однако у этого подхода есть несколько недостатков:
- копирование/вставка URL-адреса непосредственно из браузера приведет к отсутствию мета-тегов. Вы могли бы обнаружить, что пользовательские агенты на сервере перенаправляют на
/share
, автоматически делая это несоответствующим, но это также потребует перехода на маршрутизацию HTML5, и в этом случае вы также можете использовать первое решение - портит поведение кнопки назад. Ваши пользователи окажутся в ситуации, когда им придется дважды щелкнуть по кнопке "Назад", чтобы вернуться на страницу, на которой они изначально находились, до перехода по общей ссылке.
- нужна кнопка для каждой социальной службы (или перенаправления на основе пользовательского агента, как указано выше)
Считайте, что это решение "да, это работает, но на самом деле это не очень хорошая идея".
Prerender.io
Последнее (и самое простое) решение - использовать что-то вроде prerender.io. Я никогда не использовал его лично, поэтому, где мой вклад заканчивается этим, но стоит упомянуть, поскольку это именно тот сценарий, для которого он был создан.