404エラーが発生する際にAEMのPathに対するの分岐処理

目次

目的

Webブラウザでサーバーにアクセスした際、ページが存在しない場合は404ステータスコード(not found)が返されます。AEMの場合、あらかじめ用意された404ページが表示されますが、リクエストURLに特定のAEMパス(例:/content/site/aa)が含まれている場合、それを別のAEMパス(例:/content/site/bbb)に分割して、特別な404ページを表示する方法を説明します。

背景

Webブラウザからリクエストがあると、DispatherサーバーはまずDispatherのキャッシュでページを検索して応答し、ページが存在しない場合は、Publishサーバーにリクエストを投げます。そして、Publishサーバーにも、ページが存在しないと、Publishサーバーは、404ステータスコードなどをDispatherサーバーに返します。

Chapter 2 - Dispatcher infrastructure

ここで、重要なポイントは、Dispatherサーバーconfファイルの "DispatcherPassError " 項目の設定値です。

Dispatcher specific configuration entries

つまり、"DispatcherPassError "が "0 "に設定されている場合、エラーハンドルはPublish側で処理されます。処理されたエラーレスポンスは、直接ブラウザに返されます。DispatcherPassError "が "1 "に設定されている場合は、Apache ErrorDocument ディレクティブで処理されたエラーレスポンスがブラウザに返されます。ここからは、リクエストURLの特定のAEMパスごとに返される404ページを分離する方法を説明します。

実現方法

その1:Publish 側の Sling Error Handler 処理

前提条件:Dispather の conf に "DispatcherPassError" が "0 "と設定します。

DispatcherPassError 0

ページが存在しない場合、Publish側の Sling Error Handler プロセスが起動し、404.jspが呼び出されます。そして、404.jspで生成されたエラーページがDispather側に返却されます。下記AEMののソースコードを app 配下にコピーし、異なるエラーページを返すようにロジックをカスタマイズすることができます。

/libs/sling/servlet/errorhandler/default.jsp
/libs/sling/servlet/errorhandler/404.jsp

たとえば、リクエストURLを受け取り、特定のAEMパスで判定し、該当するエラーページのパスをレスポンスのリダイレクト項目に設定します。

<%
    String path = (String) request.getPathInfo();
    if (path != null && path.startsWith("/content/site/aaa/")) {
        response.sendRedirect("/content/site/aaa/404.html");
    } else {
        response.sendRedirect("/content/site/bbb/404.html");
    }
%>
その2:Apache 側の ErrorDocument 処理

前提条件:Dispather の conf に "DispatcherPassError" が "1 "と設定します。

DispatcherPassError 1

Apachehttpd.conf では、REQUEST_URI 変数からリクエストURLを取得して、特定のAEMパスで判定し、ErrorDocumentにはステータスコードに適用されるエラーページのパスを設定します。

※ /(​スラッシュ)は、「\x2F」と記述します。

<If "%{REQUEST_URI} =~ /\x2Fcontent\x2Fsite\x2Faaa\x2F.*/">
    ErrorDocument 404 /content/site/aaa/404.html
</If>
<Else>
    ErrorDocument 404 /content/site/bbb/404.html
</Else>