AstroでRSSフィードを作る方法|記事の更新を正しく配信する最小構成

AstroのContent Collectionsから公開記事だけを取得し、日付順のRSSを生成するTypeScriptエンドポイントと、URL・XML・更新漏れの検証手順を解説します。

Astroの記事サイトへRSSを追加するなら、最初は「公開記事のタイトル、説明、URL、公開日をXMLで返す」ところまでを完成させます。Astro公式の@astrojs/rssを使い、Content Collectionsから静的なrss.xmlを生成する手順をまとめます。コレクション自体が未作成なら、先にAstroでMarkdown記事サイトを作る最小構成を確認してください。

RSSを置くメリット

RSSは、サイトの更新情報を機械が読めるXMLで配る入口です。読者はRSSリーダーへフィードURLを登録し、複数サイトの新着をまとめて確認できます。運営側も、記事一覧とは別に再利用しやすい更新データを持てます。

ただし、設置だけで購読者や検索順位が増えるとは限りません。下書きが混ざらず、正しいURLで新着を配れることが先です。公開後は/rss.xmlへのリンクを置き、必要ならHTMLのheadrel="alternate"type="application/rss+xml"を指定します。

確認日: 2026-07-24
出典: https://docs.astro.build/en/recipes/rss/

RSS 2.0仕様では、フィード全体のtitlelinkdescriptionが必須です。各itemはtitledescriptionの少なくとも一方を持ち、記事を開くURLはlink、公開日時はpubDateで表します。

確認日: 2026-07-24
出典: https://www.rssboard.org/rss-specification

必要な情報をそろえる

フィード全体にはtitledescriptionsiteitemsが必要です。記事側はtitledescriptionlinkpubDateをそろえます。frontmatterの項目名と型も統一してください。

titleはフィード名、descriptionはサイト全体の説明です。記事ごとの同名項目と混同しないようにします。linkには記事の正規URL、pubDateには初回公開日を渡します。カテゴリやタグは後から追加できますが、まず必須情報が全記事で欠けない状態を作る方が、配信漏れを見つけやすくなります。

---
title: '記事タイトル'
description: '記事の要点'
pubDate: 2026-07-24
draft: false
---

pubDateは日付、draftは真偽値としてschemaで検証します。エラー時はContent Collectionsの型エラーを直す手順で照合します。さらにastro.config.mjsへ正式URLを設定します。

export default defineConfig({
  site: 'https://example.com',
});

本番URLが未確定なら、公開前の確認事項として※要確認を残します。

RSS用エンドポイントを作る

@astrojs/rssを追加し、src/pages/rss.xml.tsを作ります。Astro公式ではsrc/pages内の.tsも静的エンドポイントにでき、ファイル名から/rss.xmlが生成されます。

npm install @astrojs/rss
import type { APIRoute } from 'astro';
import { getCollection } from 'astro:content';
import rss from '@astrojs/rss';

export const GET: APIRoute = async (context) => {
  const posts = await getCollection(
    'articles',
    ({ data }) => data.draft !== true,
  );

  return rss({
    title: 'サイト名',
    description: 'サイトの更新情報',
    site: context.site,
    customData: '<language>ja</language>',
    items: posts.map((post) => ({
      title: post.data.title,
      description: post.data.description,
      pubDate: post.data.pubDate,
      link: `/kiji/${post.id}/`,
    })),
  });
};

articles/kiji/は実際のコレクション名、記事ルートに合わせます。context.siteを使えば、ドメインの重複記述を避けられます。

この例ではdraft !== trueを条件にし、draftが未記入の記事も公開対象にしています。サイト側が「未記入は非公開」という運用なら条件をdraft === falseへ変えます。記事ページとRSSで公開条件が違うと、ページに出ない記事がRSSだけに現れるため、同じ判定式を共通化するかテストで一致を確認してください。

確認日: 2026-07-24
出典: https://docs.astro.build/en/recipes/rss/
出典: https://docs.astro.build/en/guides/endpoints/

実装方針を一覧で決める

サイトの公開ルールを先に表へ落とすと、記事一覧とRSSの食い違いを防ぎやすくなります。

判断項目最小構成の選択別の選択が必要な場合確認箇所
下書き除外draft !== true未記入も非公開ならdraft === false記事一覧とRSSの条件が同じか
itemの内容descriptionで要約配信全文が必要ならcontentへ安全なHTMLを渡す相対URL、画像、不要要素
並び順pubDateの降順同日記事が多ければ時刻かIDを第2条件にする先頭が最新記事か
URL末尾既定では末尾スラッシュありサイトがtrailingSlash: "never"ならRSS側をfalseにするcanonical URLとの一致
生成タイミング静的サイトではビルド時SSRではリクエスト時の生成も可能配信環境と更新反映の時点
検証dist/rss.xmlをXML解析公開後はフィードURLも対話的に検証件数、順序、絶対URL、文字コード

記事コレクションを日付順に並べる

getCollection()の返却順を新着順だと思い込んではいけません。Astro公式は、順序が非決定的で環境にも依存するため、必要な順へ自分で並べるよう案内しています。RSSへ渡す前に公開日の降順を固定します。

const posts = (
  await getCollection('articles', ({ data }) => data.draft !== true)
).sort(
  (a, b) => b.data.pubDate.valueOf() - a.data.pubDate.valueOf(),
);

同じ公開日の順番が重要なら時刻または記事IDを第2条件にします。更新のたびにpubDateを書き換えず、初回公開日と更新日は別項目で管理します。

日付が文字列のままなら、比較前にDateへ変換します。schemaでz.coerce.date()を使っておけば、取得後のpubDateを日付として扱えます。不正な日付をRSS生成時まで持ち越さず、Content Collectionsの検証段階でビルドを止める設計にすると原因を追いやすくなります。

確認日: 2026-07-24
出典: https://docs.astro.build/en/guides/content-collections/

本文と説明を出し分ける

最初はdescriptionだけを配り、本文はlink先で読んでもらう構成が安全です。Markdown変換、画像URLの書き換え、HTMLの無害化をRSS側へ持ち込まずに済みます。

全文配信ではitemのcontentへHTMLを渡せます。ただしAstro公式は、相対パスの画像や内部リンクはそのまま扱えず、スタイルやスクリプトにも追加対応が必要だと説明しています。全文が必要なら、HTMLを無害化し、画像とリンクを絶対URLへ直してから検証します。

確認日: 2026-07-24
出典: https://docs.astro.build/en/recipes/rss/#including-full-post-content

RSSを自動検出できるようにする

フィードURLを画面に掲載するだけでなく、共通レイアウトのheadへ次の要素を置くと、対応するブラウザやRSSリーダーがフィードを検出できます。

<link
  rel="alternate"
  type="application/rss+xml"
  title="サイト名のRSS"
  href="/rss.xml"
/>

WHATWGのHTML標準では、rel="alternate"type="application/rss+xml"を持つlink要素がフィード自動検出の対象です。複数のフィードを置く場合、文書内で最初のものが既定候補になるため、サイト全体のフィードを先に置きます。

確認日: 2026-07-24
出典: https://html.spec.whatwg.org/multipage/links.html#link-type-alternate

URLと文字コードを検証する

ブラウザ表示だけで終えず、ビルド後のdist/rss.xmlをXMLとして読みます。

$path = 'dist/rss.xml'
if (-not (Test-Path -LiteralPath $path)) {
  throw 'dist/rss.xml がありません'
}
$xml = [xml](Get-Content -LiteralPath $path -Raw -Encoding utf8)
$xml.rss.channel.item | Select-Object title, link, pubDate

item数が公開記事数と一致するか、各linkが正式ドメインの絶対URLか、日本語や&を含むタイトルが壊れていないかを確認します。末尾スラッシュなしのサイトでは、rss()trailingSlash: falseも検討します。AstroのRSSは既定で項目URLに末尾スラッシュを付けるため、サイト本体の設定と合わせます。URL統一はcanonical URLの書き方も参照してください。

さらに先頭と末尾の記事を目視し、古い記事が途中で欠けていないかを見ます。XML宣言と実際の保存文字コードが食い違うと、読む側によって日本語が崩れることがあります。PowerShellでは-Encoding utf8を明示し、公開後は取得したレスポンスの本文とContent-Typeも確認します。検証用タイトルには日本語、半角記号、長い説明文を含めると境界の不具合を拾いやすくなります。

公開後はW3C Feed Validation Serviceへhttps://example.com/rss.xmlのような実URLを入力し、RSS構文も確認できます。このサービスは対話的な利用を前提としているため、CIからの自動アクセスには使わず、自動検査はローカルのXML解析で行います。

確認日: 2026-07-24
出典: https://validator.w3.org/feed/
利用条件: https://validator.w3.org/feed/terms.html

更新時の確認を自動化する

公開前検査へ、rss.xmlの存在、XML解析、item数、日付順、絶対URLを追加します。最低限の合格条件は次の6点です。

  1. dist/rss.xmlが生成される
  2. XMLとして解析できる
  3. 公開記事だけを含む
  4. 最新記事が先頭にある
  5. 全リンクが正式ドメインを使う
  6. 日本語とXML予約文字が崩れない

Astroサイトのリンク切れを自動検査する方法と同様に、原稿ではなくビルド後の出力を検査すると、ルート変換後の不一致も拾えます。パッケージ更新時は設定項目を再確認してください。

自動検査が落ちたときは、そのまま配信せず、対象記事ID、期待した件数、実際の件数をログへ残します。単に「RSS検査失敗」と出すより、下書き除外、日付、URL、XML解析のどこで止まったかを分けると修正が速くなります。記事追加のたびに同じ検査を通せば、RSSだけ更新を忘れる手作業も減らせます。

確認日: 2026-07-24
出典: https://www.npmjs.com/package/@astrojs/rss

よくある質問

AstroのRSS URLはどこになりますか

src/pages/rss.xml.tsを作った場合は/rss.xmlです。拡張子を含むエンドポイントは、サイトの末尾スラッシュ設定にかかわらず/rss.xml/ではなく/rss.xmlでアクセスします。

draftの記事がRSSに出るのはなぜですか

getCollection()で下書きを除外していないか、記事一覧とRSSで条件が違う可能性があります。draft未記入時の扱いを決め、draft !== trueまたはdraft === falseのどちらかへ統一してください。

RSSへ記事全文を配信できますか

できます。itemのcontentへHTMLを渡します。ただし、相対パスの画像や内部リンクはそのままでは扱えないため、絶対URLへの変換とHTMLの無害化、出力確認が必要です。最初はdescriptionだけの要約配信が実装範囲を絞れます。

記事を更新してもRSSへ反映されないのはなぜですか

静的サイトのエンドポイントはビルド時に生成されるため、原稿の保存だけでは公開中のRSSは変わりません。再ビルドと再デプロイ後に、公開URLのレスポンスを確認します。SSR構成では生成タイミングが異なるため、対象ルートが静的生成かオンデマンド生成かも確認してください。

RSSが正しいかどうかはどう確認しますか

まずdist/rss.xmlをXMLとして解析し、公開記事数、日付順、絶対URL、日本語を確認します。公開後はW3C Feed Validation ServiceへフィードURLを手動入力すると、RSS仕様上のエラーも確認できます。

次に確認する関連記事

続き(結論と実データ)はnoteに置いています

ここでは手順のところまで書きました。実際に出た数字、うまくいかなかった条件、そのまま使える設定ファイルは、 note の記事にまとめてあります。

noteで続きを読む Xをフォローする