mursのColdFusionメモ

頭の中から抜け落ちていく情報をメモがわりに書き溜めていくブログです。

Tomcatエラーでカスタムエラーページを表示する

下記のFAQで、特定の状況下でTomcatエラーが表示される場合があり、そこにTomcatのバージョンが表示されるのを防ぐ方法が紹介されている。

cfassociates.samuraiz.co.jp

多くの場合はColdFusionのエラーになるのでこのエラーを見かける事はあまりないが、こういった場合にTomcatのエラーが発生する場合がある模様

  • 上記のFAQのように、指定された上限よりも多いFormパラメータをPOSTした時のHTTP400エラー
  • 〃の条件で、内蔵WebサーバーでFormパラメータをPOSTした時のHTTP500エラー
  • CF2018Upd8~やCF2021で追加された、CFとWebサーバーコネクタ間のsecret不一致時のHTTP403エラー
  • JSPを実行してHTTP500エラー

上記のFAQから辿れるメーカーのテックノートを見ると、Tomcatエラーに対するカスタムエラーページも設定できるみたい。

ホスト応答からの情報漏えいから引用

errorCode.<Status Code>="Path to error page relative to the runtime folder"

えっと、runtimeフォルダからエラーページへの相対パスを指定すればよいみたい。 runtimeフォルダを基準?なんでだろう??って思った。そこで、上記のテックノートから辿れるTomcatのページを見てみた

Apache Tomcat 9 Configuration Reference (9.0.63) - The Valve Componentから引用・抜粋

errorCode.nnn → The location may be relative or absolute. If relative, it must be relative to $CATALINA_BASE.

相対パスの場合は、$CATALINA_BASEを起点にする、つまり、ColdFusion内部のTomcatのCATALINA_BASEが[cf_root]/{インスタンス(cfusion等)}/runtimeってことなのか。

ColdFusionのSERVER変数にTomcatの変数も取得できたはずなので、確認してみた。

<cfdump var="#Server#">

うん。やっぱり[cf_root]/{インスタンス(cfusion等)}/runtime になっている。ちょっとしたことだったけど理由がわかってスッキリした。

じゃあ、エラーを表示してみよう。。。ただ、エラーはHTMLページ(.cfmページはダメ)で作らないといけないようだ。 デザインを含めて一から作るのはあれだし、とりあえずColdFusionに入っているエラーページをちょっと改造して使ってみよう。

[cf_root]{インスタンス(cfusion等)}\wwwroot\CFIDE\administrator\templates に request_timeout_error.htm というhtmlのエラーページがある。 これは、Enterprise版でのみ有効な「リクエストキューのタイムアウトページ」の標準エラーページだ。

このhtmファイルをコピーして、適当なファイル名(今回は400.htm)にして、ファイルをテキストエディタで開いて、ページの最後のメッセージを変えてみる。

あとは、server.xmlに errorCode.400を追加して

あとは、administratorで設定しているPOSTの上限を超えるフォームコントロールを送信すれば良い。。。

<cfform>
    <cfinput type="submit" name="submit" >
    <cfloop from="1" to="1001" index="i" >
        <cfinput type="text" name="p_#i#" value="#i#" >
    </cfloop>
</cfform>

それを Webサーバー経由(今回はIIS)で実行してSUBMITすると。。出来た。

ちょっと不格好だけど良いか。ってことでおしまい。

メモ

フォームの入力ページを使いまわしていたら、偶然 enctype="multipart/form-data" が含むフォームだった。 昔のバージョンからそうだけど、 enctype="multipart/form-data"のフォームは入力上限の規制が適用されない。 この制限を設けたセキュリティ上の懸念が enctype="multipart/form-data"には該当しないからなのかな?