AEM開発者ブログ by YAMATO

アドビ社のデリバリーパートナー大和株式会社のAEM開発者ブログです。

AEMのSitemap入門から実装まで

AEM Developerのみなさま、こんにちは。大和株式会社の増田です。

Webサイトを構築・運用する際、SEO対策の基本として必ず話題に上がるのがSitemapの設定です。

「Sitemapってそもそもなんだっけ?」
「AEMでSitemapの設定方法ってどうやるんだっけ?」
「標準機能(OOTB)と、昔よく使われていたACS AEM Commonsって何が違うの?」
と悩んだことはありませんか?

今回は、AEMにおけるSitemapの基礎知識から、AEMでの3つの実現方式の違い、そして実際の設定方法について、できるだけわかりやすく解説していきます!

1.Sitemapの基礎知識

Sitemapとは

Sitemapとは、Googleなどの検索エンジンのクローラーに対して「自分のサイトにどんなページがあって、いつ更新されたか、どのように構成されているか」を伝えるための情報が記載されたXMLファイルです。
※一般的に「Sitemap」といった場合、SEOの文脈では「XML Sitemap」を指し、本記事でも同様の扱いをします。

Sitemapの仕様自体はAEM独自のものではなく、Sitemaps.orgで定義されたプロトコル、ルールに基づいています。
URLだけでなく、設定や追加実装によっては画像・動画・ニュースコンテンツや、多言語ページなどの情報を拡張して扱うことができます。

どのようなAEMサイトで役立つ?

AEMで構築されるWebサイトは、数千~数万ページに及ぶ大規模なサイトや、多言語・多地域展開を行っているサイトが多くあります。
こういった大規模サイトでは検索エンジンのクローラーが自力ですべてのページを見つけきれず、インデックスされないことで検索結果に出てこないといったリスクがあります。

Sitemapを適切に作成することで、以下のような効果が得られます。

  • URLの発見・クロールの支援
    Sitemapを提示することで、検索エンジンに対してクロールしてほしいURLを効率的に伝えることができます。
  • 新規・更新コンテンツの発見を支援
    新規追加されたページや更新されたページを検索エンジンへ伝えることで、クロール対象として認識されるための手助けになります。
  • 複雑な階層構造の補完
    深い階層にあるページ、JavaScript等で動的にリンクされるページも、Sitemapに記載しておくことでURLの発見を補助できます。
  • 多言語・多地域の最適化
    言語ローカライズのリンク情報もSitemapに含めることで、言語・地域別ページの対応関係を検索エンジンに伝えられます。

2.AEMにおける3つの実現方法、違いと設定方法

AEMでSitemapを実装する場合、大きく分けて3つの選択肢が存在します。
・OOTB(標準機能)
・ACS AEM Commons
・カスタム実装

それぞれの特徴を表にまとめてみました。

方法 概要 推奨環境 負荷 カスタマイズ性
OOTB(標準機能)
※推奨
Apache Sling Sitemapを基盤とするAEM標準機能を利用 AEM as a Cloud Service/AEM 6.5 SP11以降 低 中
ACS AEM Commons ACS AEM CommonsのSitemap Generatorを利用 AEM 6.5.10以前など標準機能がない旧環境、または既存レガシー環境 高 中~高
カスタム実装 AEM標準のSitemap機能を拡張、またはServlet等で独自実装 特殊な要件、動的コンテンツがある場合 低~
(要件次第)
高

なぜACS AEM CommonsからOOTB(標準機能)への移行が推奨されているのか?

昔からAEMに携わっているエンジニアの方だと「Sitemap=ACS AEM Commons」という印象が強いかもしれません。

従来利用されてきたACS AEM Commonsは、リクエスト時にSitemapをリアルタイム生成する方式でした。
そのため、大規模サイトなどではPublishへの負荷を考慮する必要があります。
実際の運用では負荷の少ない時間帯での生成と、Dispatcher/CDNキャッシュを利用し、リクエストごとに生成処理が実行されないように設計します。

Apache Sling Sitemapを基盤とするAEM標準機能では、リクエスト時にSitemapを生成するオンデマンド方式と、スケジュール設定によりバックグラウンドでSitemapを生成する方式の両方に対応しています。
スケジュール設定を行うことで、非同期ジョブ(Sling Job)によって定期的にXMLを生成・保存し、リクエスト時には生成済みXMLを返すことができます。さらに、Dispatcher/CDNキャッシュを組み合わせることで、配信時の負荷を抑えられます。

新規実装であれば、まずAEM標準のSitemap機能で要件を満たせないか確認するのがおすすめです。

ACS AEM Commonsの公式ドキュメントでも、Sitemap GeneratorについてAEM標準のSitemap機能を優先するよう案内されています。

一方、すでにACS AEM Commonsを利用している既存システムや、カスタム実装を行っている場合については、推奨機能を使用していないという理由だけで即座に移行するのではなく、AEMのバージョン、現在のSitemapの実装、カスタマイズ内容、運用要件などを確認した上で移行を判断するのがよいでしょう。

3.それぞれの設定方法と実装ポイント

ここからは実際の導入・設定方法を見ていきましょう!

①OOTB(標準機能):Apache Sling Sitemap

AEM as a Cloud Service や AEM 6.5 SP11以降をお使いの場合、以下の手順で標準のSitemapを有効化できます。

Step1:Sitemapルートの設定

Core ComponentsのPage Componentを利用している場合、ページプロパティのSEO設定にSitemapに関する設定があります。

・Sitemapの起点となるページをコンテンツから選択し、プロパティを開きます。
・詳細タブにあるSEOセクションから「Generate Sitemap」を有効にします。

Step2:Dispatcherの設定

AEM側でSitemapを生成できても、Dispatcherがリクエストを拒否している場合、外部から取得できません。
そのため、Dispatcherのfilter設定も確認する必要があります。

AdobeのSitemapに関するサンプルでは、Sitemap IndexおよびSitemap XMLへのアクセスを許可するため、例えば、次のような設定が紹介されています。
プロジェクトのDispatcherルールに合わせて調整してください。

/0200 {
    /type "allow"
    /path "/content/*"
    /selectors '(sitemap-index|sitemap)'
    /extension "xml"
}

Step3:URLの設定

Sitemapで重要なのがURLです。
AEM内部では/content/mysite/jp/aboutといったパスで管理されています。
ただし、ユーザーや検索エンジンに見せるURLはhttps://www.example.com/about/などになるでしょう。

Sitemapには後者の、外部公開URLを使う必要があります。
OOTBのSitemap機能では、Sling Resource Resolver Mapping(Sling Mapping)を活用して、AEM内部のパスから外部公開URLを生成します。
例えば、Sitemapを生成するPublish環境の/etc/map/https配下に、公開ドメインとAEM内部のコンテンツパスの対応を設定します。設定後は、Sitemap内のURLが、ドメインやパス、拡張子を含めて実際の公開URLと一致していることを確認してください。 この例では、Sitemapには以下のように記載されます。
<loc>https://www.example.com/about/</loc>

バックグラウンド生成を利用する場合は、Publish環境でorg.apache.sling.sitemap.impl.SitemapSchedulerのOSGi設定を作成し、生成スケジュールと対象パスを設定します。設定後は、生成処理が完了し、Publish環境でSitemapを取得できることを確認してください。

これにより、OOTBによるSitemap機能の有効化および設定が完了しました。

※補足:Sitemap Indexとは
Sitemap Indexは、複数のSitemapファイルのURLを一覧にまとめたXMLファイルです。各ページのURLを記載するSitemapに対して、Sitemap Indexには各SitemapのURLを記載します。
1つのSitemapには、最大50,000件のURL、非圧縮で50MBまでという制限があります。そのため、大規模サイトなどでSitemapを複数のファイルに分ける場合には、Sitemap Indexを利用して検索エンジンへまとめて伝えることができます。
AEMのOOTBでは、最上位のSitemapルートからSitemap Indexを取得できます。例えば、/content/mysite/jpを最上位のSitemapルートに設定した場合、取得先は/content/mysite/jp.sitemap-index.xmlとなります。

②ACS AEM Commons

ACS AEM Commonsは、AEMプロジェクトで利用できる便利な共通機能をまとめたオープンソースプロジェクトです。
※ACS AEM Commonsは、Adobe Consulting Servicesを起点として公開されたオープンソースのAEM開発・コンポーネントツールキットです。現在はAEM開発者コミュニティによって保守されており、Adobe Supportのサポート対象ではありません。

ACS AEM Commonsの概要やインストール方法は、以前の記事「ACS AEM Commons全機能ひとこと紹介 2025年版」で紹介しています。未導入の場合は、こちらをご参照ください。
導入するバージョンは、お使いのAEM環境との互換性をACS AEM Commons公式の互換表で確認してください。

ここでは、AEM 6.5のPublish環境にACS AEM Commonsがインストール済みであることを前提に、Sitemap Generatorの設定方法を説明します。

Step1:Sitemap Generatorを設定する

ACS AEM Commons Sitemap Generatorの実体は、com.adobe.acs.commons.wcm.impl.SiteMapServletというServletです。
このServletに対して、Sitemapの起点として利用するページのResource Typeを設定します。

例えば、Sitemapを生成したいページのResource Typeがmyproject/components/page/homeだったとします。

この場合、Publish環境のOSGi Configurationで、SiteMapServletの設定インスタンスを作成し、sling.servlet.resourceTypesにmyproject/components/page/homeを指定します。

また、外部公開URLの生成に使用するExternalizerのドメイン設定も確認します。
externalizer.domainには、Externalizerに設定されているドメイン設定名を指定します。例えば、publishを使用する場合は、その設定が実際の公開ドメインに対応していることを確認してください。

Step2:Sitemapへのアクセス

設定が完了したら、AEM PublishでSitemapへアクセスします。

例えば、起点となるページが/content/mysite/jpなら、
/content/mysite/jp.sitemap.xmlへアクセスします。

レスポンスとして、

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    ...
</urlset>

が返ってくれば成功です。

Step3:/sitemap.xml にしたい場合

実際の公開サイトでは、
https://www.example.com/content/mysite/jp.sitemap.xml

ではなく、
https://www.example.com/sitemap.xml

としたいことが多いでしょう。

その場合には、Sling Resource Resolver MappingやApache mod_rewriteなどを利用して、公開URLとAEM内部URLを対応付けます。

例えば、

/sitemap.xml
        ↓
/content/mysite/jp.sitemap.xml

という関係を作ります。

ACS AEM Commons公式でも、Sling Resource Resolver MappingまたはApache mod_rewriteを利用して、ドメインルートの/sitemap.xmlとして公開する方法が案内されています。

Step4:ACS AEM Commonsで設定できる項目

ACS AEM CommonsのSitemap Generatorでは、単純にURLを出すだけではなく、いくつかの追加設定が可能です。

例えば、以下のような項目があります。

設定 内容
include.lastmod 最終更新日時を含める
changefreq.properties 更新頻度をページプロパティから取得
priority.properties 優先度(Priority)をページプロパティから取得
exclude.property Sitemapから除外するためのプロパティ名を指定
externalizer.domain Externalizerのドメイン設定名を指定
extensionless.urls .htmlを省略し、末尾スラッシュ付きのURLを生成

特にexclude.propertyは実務上重要です。

「このページはWebサイト上では公開しているが、Sitemapには含めたくない」という要件が出てきた場合に利用できます。

既定値はhideInNavで、ナビゲーション非表示の設定がSitemapからの除外にも使われます。ナビゲーションへの表示とSitemapへの掲載を別々に管理したい場合は、専用のページプロパティを用意し、その名前をexclude.propertyに指定することを検討してください。

③カスタム実装

最後にカスタム実装です。

カスタム実装には、AEM標準のSitemap機能を拡張する方法と、Servletなどで独自に実装する方法があります。
標準機能やACS AEM Commonsの設定だけでは、プロジェクト固有の要件を満たせない場合に検討します。

例として、以下のような要件ではカスタム実装を検討する価値があります。

  • 特定のページタイプだけを対象にしたい
  • 外部システムのURLもSitemapに含めたい
  • AEMページと外部データを統合したい
  • 特殊な除外ルールがある
  • URL生成ロジックが非常に特殊
  • ページ以外の情報をSitemapに含めたい
  • 独自のSitemap Index構成にしたい

まずは標準機能の拡張で対応できるかを確認し、必要に応じてServletなどによる独自実装を検討します。それぞれの実装方法を見ていきましょう。

方法1:AEM標準のSitemap機能を拡張する場合

標準機能の拡張では、独自のSitemapGeneratorを実装することで、Sitemapに含めるコンテンツやURLの生成処理をカスタマイズします。
標準の生成・配信の仕組みを活用しながら、プロジェクト固有の処理を追加したい場合に適しています。

実装は、例えば以下の流れで進めることができます。

  • ResourceTreeSitemapGeneratorを継承したクラスを作成する。
  • リソースの探索条件・掲載条件・公開URLの生成処理を実装する。
  • 実装したジェネレーターをOSGiサービスとして登録し、既存のジェネレーターとの優先順位を設定する。

以下は実装例です。

@Component(
    service = SitemapGenerator.class,
    property = {
        "service.ranking:Integer=20"
    }
)
public class CustomSitemapGenerator
        extends ResourceTreeSitemapGenerator {

    @Override
    protected void addResource(
            String name,
            Sitemap sitemap,
            Resource resource)
            throws SitemapException {

        // 対象リソースから公開URLを生成
        // sitemap.addUrl(...)でURLを追加
    }

    // shouldFollow(...)で探索条件を実装
    // shouldInclude(...)で掲載条件を実装
}

service.rankingの値は、既存のジェネレーターとの関係に合わせて調整します。また、標準ジェネレーターを置き換える場合は、公開状態やnoindex、認証が必要なページなどの扱いも確認してください。

設定した生成方式でSitemapを生成し、対象のジェネレーターが選択されていること、掲載対象・除外対象・出力URLが意図したとおりになっていることを確認します。

方法2:Servletで独自に実装する場合

Servletによる独自実装では、リクエストを受け付ける処理からSitemapのXML出力までを自前で実装します。
標準機能の拡張では対応が難しい場合や、既存システムとの関係で独立した生成・配信の仕組みが必要な場合に検討します。

実装は、例えば以下の流れで進めることができます。

  • リクエストを受け付けるServletを作成する。
  • 掲載対象の取得・公開URLの生成・XML出力処理を実装する。
  • Resource Type・セレクター・拡張子を指定し、Servletを登録する。

以下は実装例です。

@Component(
    service = Servlet.class,
    property = {
        "sling.servlet.resourceTypes=myproject/components/page/home",
        "sling.servlet.selectors=custom-sitemap",
        "sling.servlet.extensions=xml",
        "sling.servlet.methods=GET"
    }
)
public class SitemapServlet extends SlingSafeMethodsServlet {

    @Override
    protected void doGet(
            SlingHttpServletRequest request,
            SlingHttpServletResponse response)
            throws IOException {

        response.setContentType("application/xml");
        response.setCharacterEncoding("UTF-8");

        // ページを取得
        // Sitemap XMLを生成
        // responseへ出力
    }
}

この例では、指定したResource Typeを持つページに対して、custom-sitemapセレクターとxml拡張子でアクセスすると、Servletが呼び出されます。

起点ページが/content/mysite/jpで、Resource Typeがmyproject/components/page/homeなら、アクセス先は以下になります。
/content/mysite/jp.custom-sitemap.xml

対象URLへアクセスし、正しいXMLが返ること、掲載対象・除外対象・出力URLが意図したとおりになっていることを確認します。また、公開時にはDispatcherなどの経路からも取得できることを確認してください。

共通考慮

どちらの方法であっても、生成するタイミングと配信方法を設計することが重要です。

リクエストのたびに大量のページや外部データを取得してXMLを生成する構成では、ページ数やアクセス数に応じて処理負荷が増えます。

標準機能の拡張では、標準のバックグラウンド生成やスケジューラーを活用します。Servletによる独自実装では、必要に応じて定期的にXMLを生成・保存し、リクエスト時には生成済みのファイルを返す構成を検討します。

さらに、以下のような構成でDispatcherやCDNのキャッシュを活用すると、AEM Publishへのリクエストを減らせます。

Browser
   ↓
CDN
   ↓
Dispatcher
   ↓
AEM Publish

キャッシュの有効期間に加えて、ページの公開・更新・削除をSitemapへ反映するタイミングも決めておきましょう。更新頻度や許容できる反映までの時間に応じて、生成頻度とキャッシュの有効期間を調整することが重要です。

4.最後に

特に新規のAEMプロジェクトでは、最初からカスタムSitemapを作るのではなく、まずAEM標準のSitemap機能でどこまで要件を満たせるかを確認するのが重要です。

一方で、既存プロジェクトでは、
- 既存のCore Components構成
- 既存のACS AEM Commons
- 既存のURL設計
- Dispatcher
- CDN
- SEO要件

などをまとめて考える必要があります。

Sitemapは単純なXML生成機能に見えますが、実際には、

AEMのコンテンツ構造
        ↓
Sitemap生成
        ↓
公開URL
        ↓
Dispatcher
        ↓
CDN
        ↓
検索エンジン

というWebサイト全体の設計に関わる機能です。

そのため、「どのSitemap Generatorを使うか」だけではなく、どのURLを検索エンジンに認識させたいのか、そしてそのURLをどのレイヤーで正しく公開するのかまで含めて設計することが重要です。