下記のFAQで、特定の状況下でTomcatエラーが表示される場合があり、そこにTomcatのバージョンが表示されるのを防ぐ方法が紹介されている。
多くの場合は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"には該当しないからなのかな?