AEM開発者ブログ by YAMATO

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

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

AEM Developerの皆様お疲れさまです。AEMエンジニアの王です。

Webブラウザから、サーバーにアクセスした際、ページが存在しない場合は、HTTP 404(not found)ステータスコードが返されます。今回は、HTTP 404 ステータスコードに関して、AEMのPathに対するの分岐処理について、紹介したいと思います。

目的

AEMの場合、HTTP 404エラーが発生すると、あらかじめ用意された404ページが表示されます。ここでは、リクエストURLに特定のAEMパス(例:/content/site/aaa)が含まれている場合に、別のAEMパス(例:/content/site/bbb)と区別して、特別な404ページを表示する方法を説明します。

背景

Webブラウザからリクエストを受信すると、DispatherサーバーはまずDispatherのキャッシュでページを検索して応答し、ページが存在しない場合、Publishサーバーにリクエストを投げます。そして、Publishサーバーにも、ページが存在しないと、Publish側でエラーハンドル処理した応答をDispatherサーバーに返します。

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

  • 0 : Publishサーバーのエラー応答をすべてブラウザにスプールします。
  • 1 : Dispatherサーバー(Apache)でエラー処理を行います。

つまり、"DispatcherPassError" が "0" に設定されている場合、Publishサーバーで処理した404ページがブラウザに返されます。"DispatcherPassError" が "1" に設定されている場合は、Dispatherサーバー(Apache)でエラー処理を行います。

実現方法

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

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

DispatcherPassError 0

下記AEMのソースコードを apps 配下にコピーします。

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

apps 配下の404.jspを下記のように編集します。 リクエストURLから、判定します。特定のAEMパスが含まれていれば、特別な404ページにリダイレクトします。それ以外の場合は、通常の404ページにリダイレクトします。

<%
    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

Apache の httpd.conf では、REQUEST_URI 変数からリクエストURLを取得して判定します。特定のAEMパスが含まれている場合、ErrorDocumentには特別な404ページのパスを設定します。そうでなければ、ErrorDocumentには通常の404ページのパスを設定します。

※ /(​スラッシュ)は、「\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>

参照サイト

Chapter 2 - Dispatcher infrastructure

Dispatcher specific configuration entries

最後に

以上となります。次回は「CPUが急に高騰の原因となっているJavaスレッドの特定方法」について執筆します。お楽しみに!