- PVSM.RU - https://www.pvsm.ru -

В этой статье представлены технические советы по ведению блога. Они никак не связаны с хорошим контентом, а рассказывают о том, как делиться этим контентом. Рекомендации выстроены в примерном порядке важности и имеют обоснования своей важности.
Люди обычно называют фиды «RSS-фидами», но часто они не имеют в виду конкретно RSS. RSS — это не единственный и даже не самый лучший формат. Использование стандартизованного формата очень важно для того, чтобы ваш фид понимало максимальное количество ридеров и поисковых движков.
Вам нужно использовать RSS 2 [1] или Atom [2]. Эти форматы имеют очень широкую поддержку. Среди других популярных форматов более старые стандарты RSS и JSON Feed [3] или Microformats h-feed [4]. Я буду избегать использовать их или менее популярные форматы, потому что их поддержка не так широка.
Если у вас ещё нет фида, то крайне рекомендую воспользоваться Atom. В его спецификации гораздо меньше неопределённостей, поэтому меньше вероятность проблем совместимости с широким ассортиментом клиентов. Кроме того, спецификация в целом проще и понятнее. Если у вас уже есть фид RSS 2, то причин для апгрейда почти нет.
Минимальный шаблон Atom представлен ниже. Все подробности можно узнать в спецификации [5]. Если вам нужен пример, можете взглянуть на мой фид [6].
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>{{FEED_NAME}}</title>
<id>{{HOMEPAGE_URL}}</id>
<link rel="alternate" href="HOMEPAGE_URL"/>
<link href="FEED_URL" rel="self"/>
<updated>{{LAST_UPDATE_TIME in RFC3339 format}}</updated>
<author>
<name>{{AUTHOR_NAME}}</name>
</author>
<entry>
<title>{{ENTRY.TITLE}}</title>
<link rel="alternate" type="text/html" href="{{ENTRY.HTML_URL}}"/>
<id>{{ENTRY.PERMALINK}}</id>
<published>{{ENTRY.FIRST_POST_TIME in RFC3339 format}}</published>
<updated>{{ENTRY.LAST_UPDATE_TIME in RFC3339 format}}</updated>
<content type="html">{{ENTRY.HTML}}</content>
</entry>
</feed>
Нет практически никаких причин для того, чтобы обеспечивать фиды в нескольких форматах. Если у вас есть Atom-фид, не нужно создавать ещё и RSS-фид.
Смена формата фида безопасна. Очень немногие ридеры будут сбиты с толку при переключении фида с Atom на RSS или наоборот. Это можно сделать изменением фида по тому же URL или перенаправлением на новый URL. (Необходимо только обновить тип контента, см. ниже.)
Правильно укажите заголовок Content-Type.
Content-Type: application/atom+xmlContent-Type: application/rss+xmlContent-Type: application/feed+jsonНа практике используются и другие значения, но выше представлены стандартные значения, имеющие самую широкую поддержку.
Все URL в вашем фиде должны быть абсолютными. Хотя в спецификации Atom чётко объяснено, как резолвить относительные URL, их редко реализуют корректно. Чтобы ваш фид точно понимали все ридеры, используйте только абсолютные URL (начинающиеся с https://).
Это относится ко всем элементам <link>, summary и body постов (включённым в HTML).
На всех страницах блога и, возможно, на каждой странице сайта нужно указать метаданные для рекламы фида. Это позволит ридерам и поисковым движкам подписываться и знакомиться с новым контентом. Для этого достаточно добавить в HTML следующую разметку:
<link rel=alternate title="Blog Posts" type=application/atom+xml href="/feed.atom">
Если у вас несколько фидов, вы можете рекламировать их под соответствующими названиями.
<link rel=alternate title="Все посты" type=application/atom+xml href="/feed.atom">
<link rel=alternate title='Посты в категории "Social"' type=application/atom+xml href="/feeds/social.atom">
<link rel=alternate title="Комментарии к этому посту" type=application/atom+xml href="/post/hello-world/comments.atom">
Используйте правильный type для своего фида. Выше представлены примеры для Atom-фидов.
«Самый важный» фид лучше помещать сверху. Многие клиенты сохраняют порядок, отображая фиды пользователю. Это субъективный выбор, но обычно по порядку должны идти фид всего сайта, затем фиды категорий, а затем фид комментариев в конкретной странице.
Можно проверить, что всё работает правильно, вставив URL своего веб-сайта в W3C Feed Validation Service [7]. Если ссылки настроены верно, он должен распознать и валидировать ваш фид. Проверьте несколько разных страниц, чтобы убедиться в правильности работы discovery. Проверьте главную страницу, страницу со списком постов и страницу отдельного поста.
Если сложно изменить HTML, то можно использовать заголовок Link в HTTP-ответе. Однако его поддержка не очень широка. Для повышения совместимости предпочтительнее использовать HTML-теги <link>.
Link: /feed.atom; rel="alternate"; type="application/atom+xml"
Также стоит дополнять ссылку логотипом RSS , чтобы её замечали пользователи без других индикаторов фидов.
HTTPS [8] критически важен для безопасности и приватности в Интернете. Передача фидов через HTTPS обеспечивает приватность пользователей и гарантирует, что ваш фид не будет модифицирован злоумышленниками.
Strict-Transport-Security [9].
В общем случае рекомендуется передавать в фиде полный контент постов. Это предпочтительно для большинства ридеров. У Atom есть элемент <summary> [10] для предпочитающих его ридеров. Для RSS и Atom должен быть включён элемент <content> [11] полной статьи.
Разумеется, для некоторых публикаций передача полного контента в фидах неприемлема из-за сложности монетизации таких просмотров. Для начала задумайтесь о том, что это может быть читатель, который уйдёт, если не сможет просмотреть полный контент в ридере фидов. Даже если он не видит рекламы на ваших страницах, он сможет поделиться контентом с друзьями или в новостных агрегаторах. Вероятно, для вас всё равно ценнее удержать этого читателя, чем терять его.
Если ваш контент платный, то рассмотрите возможность позволить пользователям генерировать приватные ссылки, предоставляя токен аутентификации. Например, /feed.atom?user=peruserauthtoken. Также можно использовать простую аутентификацию [12] вида https://fred:peruserauthtoken@blog.example/feed.atom, однако она поддерживается меньшим количеством ридеров, чем передача токена в пути URL или в строке запроса.
Entry ID — это основной способ идентификации разных записей фида. Если entry ID меняются или повторяются, то ридеры будут пропускать записи или получать дубликаты записей.
urn:uuid:f4a3ca5b-5799-44e8-aaaa-e40728f037d3.И Atom, и RSS различают время публикации (время, когда запись впервые появилась в фиде) и время последнего обновления (последний раз, когда запись была изменена). Обрабатывайте их корректно.
Свободно используйте в фиде CSS! Однако помните о том, что многие ридеры не используют движки современных браузеров и могут иметь ограничения рендеринга. Кроме того, многие ридеры очищают фиды, поэтому нестандартные элементы или собственные CSS могут быть частично или полностью вырезаны. Но пусть это вас не останавливает! Использование HTML и CSS может сильно повысить удобство для пользователей с хорошими ридерами. Воспользуйтесь следующими советами:
background: black; color: white, но одно из двух правил будет вырезано, то текст окажется нечитаемым. В общем случае стоит вносить при помощи CSS небольшие изменения, а не существенные.style CSS для разделения блоков <style>. Их совместимость выше.<p>, <h1>, <pre> и <code>, а не имитировать их стиль в <div> и <span>.<audio>, <video> и <iframe>. Они поддерживаются нечасто.К сожалению, здесь поможет только тестирование.
Убедитесь, что self-link вашего фида правильна.
<link rel="self" href="https://kevincox.ca/feed.atom"/>
Это даёт следующие преимущества:
http: вместо https:, /feed вместо /feed/, www.example.com вместо example.com, feed.atom?tracker=lookatme вместо ?category=rant&content=full или ?content=full&category=rant. Предоставляя канонизированную self link, вы можете объединить их, чтобы уменьшить вариативность и увеличить частоту попадания в кэш.Фиды сопровождаются постоянными опросами. Это может создать существенную нагрузку на ваш сервер. Настройка заголовков кэша позволит управлять ридерами. Если не предоставить никакого управления, каждый клиент будет выбирать собственное значение, что может быть слишком быстро или медленно для вашего фида. Если вы предоставите рекомендованное значение, часть ридеров его использует. Постарайтесь выбрать разумное значение в соответствии с частотой ваших публикаций. Если ваш блог дополняется ежемесячно, то, вероятно, логично кэшировать как минимум на час. Если же вы публикуете посты много раз за день, то больше подойдёт пятиминутный кэш.
Примеры заголовков кэша:
Cache-Control: max-age=300Cache-Control: max-age=900Cache-Control: max-age=3600Если вы используете запланированные публикации и хотите чего-то особенного, то можете менять время кэша на основании того, когда будет опубликован следующий пост. Однако вполне достаточно и статичного времени кэша.
Предупреждение: некоторые ридеры учитывают заголовки кэша, но многие их игнорируют. Если вас беспокоит нагрузка на сервер, то следует реализовать собственное кэширование. Например, можно использовать CDN, выполняющий кэширование, или реализовать кэширование внутри вашего приложения. Это повысит производительность вашего фида.
Обеспечьте в своём фиде поддержку условных запросов. Это сделает опросы более эффективными и для вас, и для пользователей.
Возвращайте заголовок ETag и/или Last-Modified. При этом возвращайте ответ 304, если фид не изменился. Подробнее см. в HTTP conditional requests на MDN [14].
WebSub [15] — это стандарт обновлений фидов в реальном времени. Он не только быстрее передаёт обновления, но и снижает нагрузку на ваш сервер.
Можно использовать публичный [16] хаб [17] или создать собственный. Стоит заметить, что хаб может изменять или инъектировать контент в ваш фид, так что убедитесь, что доверяете выбранному хабу.
Мне не удалось найти хороших общих инструкций, но на главной странице хаба Google [16] есть базовые инструкции. Возможно, когда-нибудь я сам напишу руководство…
Если вы используете какую-то технологию блокировки ботов, то отключите её (или снизьте её придирчивость) для фидов. Ведь их и должны потреблять боты! В противном случае у пользователей возникнут сложности с доступом к фиду и они не узнают о новом контенте.
Многие популярные [18] сайты [19] сталкиваются в этом вопросе с проблемами. Я уже писал об этом [20]. Убедитесь, что вам не вредят параметры по умолчанию различных сервисов.
Категории — надёжный способ фильтрации тем фидов. Гораздо лучше дать пользователям возможность подписываться на одну категорию (или на все, кроме одной), чем потерять подписчика из-за того, что его раздражает часть вашего контента.
Для добавления категорий в Atom-фиды достаточно одного элемента. Например, этот пост имеет в моём фиде следующую разметку:
<category term="RSS"/>
<category term="Guide"/>
Для RSS 2 синтаксис лишь немного отличается:
<category>Rant</category>
Некоторые ридеры не поддерживают категорий, поэтому можно попробовать генерировать отдельные фиды для разных категорий или создать параметр URL фида для фильтрации по категории. Лично меня это не беспокоит.
Нужно максимально стремиться избегать смены URL фида. Но если это нужно сделать, то вот как поступить, чтобы не потерять слишком много подписчиков.
Помните, что некоторые подписчики не перейдут на новый URL. Старайтесь сохранять редирект максимально долго. Спустя длительный период времени можно попробовать заменить редирект на фид с записью, сообщающей пользователям о новом адресе. Лучше перебдеть, чем недобдеть, поэтому старайтесь изначально выбирать хороший URL (который вы контролируете).
Маленькие и локальные ридеры фидов обычно используют простые частоты опроса, однако многие крупные сервисы применяют различные эвристики для того, чтобы определять, когда нужно проверять обновления вашего фида. Если вы не поддерживаете WebSub, то стоит нацелиться на то, чтобы отвечать на запросы фида за менее 1 секунды. Если ваш фид медленнее, особенно если он опрашивается медленнее, чем за 3 секунды, то есть вероятность, что опросы замедлят и ридеры будут получать обновления медленнее.
Некоторые ридеры отображают в качестве превью статьи её короткие фрагменты. Благодаря созданию краткой информации (summary) фид позволяет им отображать качественный контент и повышать удобство для пользователя. Если вы не предоставите summary самостоятельно, ридеры с большой вероятностью просто используют первый параграф или пару первых предложений из основного контента.
Пагинация — это полезный инструмент для обеспечения доступа к архиву фида с сохранением маленького размера новых постов. К сожалению, пагинацию поддерживают очень немногие клиенты. Однако добавление её поддержки не имеет никаких недостатков, поэтому стоит о ней подумать.
Пагинация очень проста. Достаточно добавить в фид следующую ссылку.
<link href="https://kevincox.ca/feed/2022-03-05.atom" rel="next"/>
Затем на последующие страницы также добавить ссылку prev. Разумеется, на последней странице не будет ссылки next.
<link href="https://kevincox.ca/feed.atom" rel="prev"/>
<link href="https://kevincox.ca/feed/2022-01-21.atom" rel="next"/>
При выборе размера страниц помните, что не все клиенты поддерживают пагинацию, поэтому не стоит слишком быстро перемещать новые записи с первой страницы. Я рекомендую следующее, но помните, что это обобщённые правила и их стоит применять рассудительно. Например, если вы публикуете посты по 20 раз в день, то вам, наверно, не стоит хранить в фиде 7 дней контента. Аналогично, если ваши посты состоят из одного-двух параграфов, то, вероятно, на первой странице может быть чуть больше записей.
Автор:
PatientZero
Источник [22]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/html/375079
Ссылки в тексте:
[1] RSS 2: https://validator.w3.org/feed/docs/rss2.html
[2] Atom: https://datatracker.ietf.org/doc/html/rfc4287
[3] JSON Feed: https://www.jsonfeed.org/
[4] Microformats h-feed: https://microformats.org/wiki/h-feed
[5] спецификации: https://datatracker.ietf.org/doc/html/rfc5023
[6] мой фид: https://kevincox.ca/feed.atom
[7] W3C Feed Validation Service: https://validator.w3.org/feed/
[8] HTTPS: https://en.wikipedia.org/wiki/HTTPS
[9] Strict-Transport-Security: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security
[10] <summary>: https://datatracker.ietf.org/doc/html/rfc4287#section-4.2.13
[11] <content>: https://datatracker.ietf.org/doc/html/rfc4287#section-4.1.3
[12] простую аутентификацию: https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication
[13] UUID: https://en.wikipedia.org/wiki/Universally_unique_identifier
[14] HTTP conditional requests на MDN: https://developer.mozilla.org/en-US/docs/Web/HTTP/Conditional_requests
[15] WebSub: https://www.w3.org/TR/websub/
[16] публичный: https://pubsubhubbub.appspot.com/
[17] хаб: https://pubsubhubbub.superfeedr.com/
[18] популярные: https://blog.cloudflare.com/
[19] сайты: https://medium.com
[20] Я уже писал об этом: https://kevincox.ca/2021/12/07/cloudflare-bot-block-failures/
[21] 308 Permanent Redirect: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/308
[22] Источник: https://habr.com/ru/post/665356/?utm_source=habrahabr&utm_medium=rss&utm_campaign=665356
Нажмите здесь для печати.