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スレッドの特定方法」について執筆します。お楽しみに!