目的
単一の AEM インスタンスが複数のサイトを処理することは非常に一般的です。通常、各ページには個別のドメインが割り当てられ、いくつかの言語バージョンが使用できます。このようなマルチドメインインストールをおこなうには、いくつかの追加の重要な設定が必要です。この投稿は、有名な Geometrixx サイトの 3 つの言語バージョンを、3 つのドメイン(geometrixx.com、geometrixx.de および geometrixx.fr)で機能するように設定する方法を示すクイックリファレンスドキュメントです。
手順
まず、AEM 自体を(Sling Mappings エンジンで)設定し、Apache の書き換え規則と VirtualHost を作成し、クロスドメインキャッシュインジェクションの脅威を排除し、最後に Apache 設定のリファクタリングを実行してより簡潔にします。
Sling Mapping エンジン
AEM でドメイン名を Web サイトにマッピングする最善の方法は、Sling Mappings を使用することです。マッピングには、次の 2 つの便利な機能があります。
- ページコンテンツ内の長いリンクは、わかりやすい形式に短縮されます。
- 短いリンクは、完全なコンテンツパスに解決されます。
入力 URL を /content/sitename の長い形式に書き戻すには、Apache レベルで mod_rewrite を利用します。ただし、mod_subsitute のようなモジュールがなければ、送信 HTML のリンクを短縮できません。そのため、HTML 出力(<a href=...> 属性など)を書き換えるには、/etc/map.publish の下に Sling Mappings を使用して URL をマッピングします。その後、AEM の標準リンクリライターで ResourceResolver.map を使用して、これらのマッピングを HTML に書き換えます。デフォルトでは、マッピングは /etc/map/http ノードの下の JCR に配置されます。/etc/map/http ノードは、パブリッシュインスタンスに加えてオーサーインスタンスに影響を与えます。そのため、代わりに、/etc/map.publish を使用して、パブリッシュインスタンスにのみ影響を与えます。これにより、オーサーインスタンスとパブリッシュインスタンスの両方に対して、マッピングを備えた 1 つの共通パッケージを使用できます。
/etc/map.publish の異なる /etc/map の場所をパブリッシュインスタンスに読み込むには、OSGi 設定を更新する必要があります。org.apache.sling.jcr.resource.internal.JcrResourceResolverFactoryImpl OSGi 設定の設定内の resource.resolver.map.location プロパティを /etc/map.publish に変更してください。
{ jcr: primaryType: "sling:OrderedFolder", geometrixx_com: { sling:internalRedirect: ["/content/geometrixx/en.html"], jcr:primaryType: "sling:Mapping", sling:match: "geometrixx.com/$" }, geometrixx.com: { sling:internalRedirect: ["/content/geometrixx/en"], jcr:primaryType: "sling:Mapping", redirect: { sling:internalRedirect: ["/$1","/content/geometrixx/en/$1"], jcr:primaryType: "sling:Mapping", sling:match: "(.+)$" } }, ... }
.de ドメインと.fr ドメインには、16 行目の 3 つのドットの後に似たエントリがあります。geometrixx_de と geometrixx.de、および geometrixx_fr と geometrixx.fr です。
geometrixx_com(3 行目から 7 行目)をマッピングすると、ルートページにリダイレクトされます。そのため、ユーザーが geometrixx.com に入ると、/content/geometrixx/en.html というページが表示されます。sling:match(6)の最後にあるドル記号は、「文字列の終わり」を意味する正規表現の制御文字で、ユーザーがスラッシュの後にパスを入力すると、このマッピングは適用されません。
geometrixx.com(8-16)のマッピングはより複雑です。これは、親(8-16)と子(11-5)で構成されます。親には sling:match プロパティが含まれていないため、ノード名(geometrixx.com)が URL パターンとして使用されます。このエントリは、ドメイン名を使用して長いリンクを短い形式に短縮する役割を果たします。例えば、/content/geometrixx/en/products は geometrixx.com/products.html に短縮されます。
子エントリは URL 解決の役割を果たします。このマッピングを一致させるには、URL を geometrixx.com(親マッピングから継承されたドメイン)から始め、その後、空でないパス文字列(14 行目の正規表現 (.+)$)を含める必要があります。12 行目の sling:internalRedirect は、/$1 と /content/geometrixx/en/$1 の 2 つのエントリを含むリストです。ユーザーが「geometrixx.com/etc/designs/geometrixx.css」と入力すると、最初のエントリが使用されます。ユーザーが geometrixx.com/products.html を入力すると、Sling は 2 番目のものを選択し、/content/geometrixx/en/products.html を返します。
Apache Felix Web コンソールを使ってマッピングを試すことができます。メニューの「Sling Resource Resolver」リンクをクリックするだけです。
Apache mod_rewrite
マッピングを定義した後(および hosts ファイルに適切なドメインを追加した場合)、短いリンクでマルチドメイン AEM インストールを設定できます。ただ 1 つ問題があります。それはディスパッチャーです。標準のディスパッチャー設定を使用している場合は、すべてのサイトに対して 1 つのキャッシュディレクトリが存在します。ユーザーがページ geometrixx.com/products.html を要求した場合、ディスパッチャーはファイル /products.html をキャッシュ dir に作成します。ここで、他のユーザーがページ geometrixx.de/products.html を要求した場合、ディスパッチャーはキャッシュされた英語版を検出してドイツ語のユーザーに提供します。このような問題を回避するには、JCR ディレクトリ構造をディスパッチャーに反映させる必要があります。短縮パスを展開する最も簡単な方法は、Apache 書き換えエンジンを使用することです。基本的に、Sling の解決メカニズムをシミュレートしようとします。以下のルールによりジョブが実行されます。
RewriteEngine On RewriteRule ^/$ /content/geometrixx/en.html [PT,L] RewriteCond %{REQUEST_URI} !^/apps RewriteCond %{REQUEST_URI} !^/bin RewriteCond %{REQUEST_URI} !^/content RewriteCond %{REQUEST_URI} !^/etc RewriteCond %{REQUEST_URI} !^/home RewriteCond %{REQUEST_URI} !^/libs RewriteCond %{REQUEST_URI} !^/tmp RewriteCond %{REQUEST_URI} !^/var RewriteCond %{REQUEST_URI} !^/dispatcher RewriteRule ^/(.*)$ /content/geometrixx/en/$1 [PT,L]
開始時(1)に、入力された URL に空のパスが含まれているかどうかを確認します(例:http://geometrixx.com/)。その場合、ユーザーはホームページに転送されます。それ以外の場合は、入力したパスが短縮されているかどうか(2 行目から 8 行目の apps、content、home などで開始されていないこと)を確認します。その場合、書き換えエンジンは絶対パス(9)を作成しながら /content/geometrixx/en を追加します。
Apache VirtualHost
ご覧のとおり、このルールは geometrixx.com ドメインに対してのみ有効であるため、各ドメインに対して同様のルールと現在のドメインを認識するための何らかのメカニズムが必要です。Apache におけるこのようなメカニズムは VirtualHost と呼ばれています。Apache2 VirtualHost のサンプル設定ファイルは次のようになります。
<VirtualHost *:80> ServerAdmin webmaster@localhost ServerName geometrixx.com DocumentRoot /opt/aem/dispatcher/publish <Directory /opt/aem/dispatcher/publish> Options FollowSymLinks AllowOverride None </Directory> <IfModule disp_apache2.c> SetHandler dispatcher-handler </IfModule> [... above rewrite rules ...] LogLevel warn CustomLog ${APACHE_LOG_DIR}/access-geo-en.log combined ErrorLog ${APACHE_LOG_DIR}/error-geo-en.log </VirtualHost>
すべての VirtualHosts で共有ディスパッチャーディレクトリを使用できます。ドメインごとに同様のファイルを作成します。
クロスドメインインジェクションの脅威
ユーザーは、指定されたドメイン名の後に完全なコンテンツパスを入力できるため(例:geometrixx.com/content/geometrixx/en/products.html)、他のドメインに属するページを取得することもできます(例:geometrixx.com/content/geometrixx/fr/products.html)。このような状況を回避するには、/content で始まるパスに対するすべての要求を確認し、キャンペーン、DAM、または現在のドメインに関連しないこれらの要求を拒否する必要があります。
RewriteCond %{REQUEST_URI} ^/content RewriteCond %{REQUEST_URI} !^/content/campaigns RewriteCond %{REQUEST_URI} !^/content/dam RewriteRule !^/content/geometrixx/en - [R=404,L,NC]
マクロ
当社の書き換え設定は非常に複雑になり、(さらに悪いことに)各 Apache VirtualHost 設定に含める必要があります。幸い、Apache マクロモジュールを使用して繰り返しを避けることができます。次の expand-aem-paths ファイルを conf.d ディレクトリに追加してください。
<Macro ExpandAEMPaths $path> RewriteEngine On RewriteRule ^/$ $path.html [PT,L] RewriteCond %{REQUEST_URI} ^/content RewriteCond %{REQUEST_URI} !^/content/campaigns RewriteCond %{REQUEST_URI} !^/content/dam RewriteRule !^$path - [R=404,L,NC] RewriteCond %{REQUEST_URI} !^/apps RewriteCond %{REQUEST_URI} !^/content RewriteCond %{REQUEST_URI} !^/etc RewriteCond %{REQUEST_URI} !^/home RewriteCond %{REQUEST_URI} !^/libs RewriteCond %{REQUEST_URI} !^/tmp RewriteCond %{REQUEST_URI} !^/var RewriteRule ^/(.*)$ $path/$1 [PT,L] </Macro>
その後、Use ディレクティブを使用して、各 VirtualHost にマクロを含めることができます。
Use ExpandAEMPaths /content/geometrixx/en
Macro モジュールは外部の Apache2 ライブラリのため、別途インストールが必要になる場合があります。Debian では、2 つのコマンドを使用してインストールおよび有効化できます。
# apt-get install libapache2-mod-macro
# a2enmod macro
他の Linux ディストリビューションまたは Windows を使用している場合は、mod_macro ホームページで該当するバージョンのモジュールとインストール手順を参照してください。
Dispatcher 設定
標準のディスパッチャー設定を使用できます。前提条件は、その docroot が /opt/aem/dispatcher/publish に設定されているということのみです。
概要
これで、Sling Mappings、Apache 2 mod_rewrite、および VirtualHost メカニズムを使用して、3 つのドメインで AEM インストールを設定しました。また、クロスドメインインジェクション攻撃を防ぎ、mod_macro を使用して Apache 2 の設定リファクタリングを実行しました。上記の設定は、カスタムマルチドメインインストールを最初から準備するのに十分なはずです。