次のようなサーバーのセットアップがあります。
- Windows 2012 R2
- Coldfusion 10、エンタープライズ
- IIS、カスタム 404 ページで構成 (サーバー上で実行)
カスタム 404 ページ (CFM ファイル) は、不足している URL を処理し、データベース内のカスタム URL と照合します。一致が見つかった場合は、関連するデータが表示されます。この問題は、カスタム URL が存在しない CFM ファイルにマップされている場合に発生します。例えば。
/home/map.cfm (実際のファイルやディレクトリではありません)
これで、ユーザーがこの URL を要求すると、サーバーはそれが CFM ファイルであることを認識し、(ISAPI リダイレクトを介して) ColdFusion に正しく渡します。Tomcat は、このファイルが実際には存在しないことを確認し、404 を返します。IIS は、この 404 メッセージを確認し、カスタム エラー ページ (/errors/404.cfm) を実行します。
結果の CGI 変数では、通常は CGI.QUERY_STRING 変数の一部として提供される元の URL を取得する (データベース内の仮想 URL にマップする) ことはできません。代わりに、QUERY_STRING 変数には、「jakarta」ディレクトリにある「isapi_rewrite.dll」ファイルへのパスが含まれています。
Tomcat がそのページに対して 404 エラーを返した後、最初に要求された (CFM ファイルの) URL を保持する方法はありますか?
トーマス・ゴルゴリオーネに触発されて、自分でまとめたソリューション
問題のファイルが存在しない場合でも、要求が ISAPI_REDIRECT モジュールに転送されることが原因であると考えられていました。
Thomas が提案したように、洗練された解決策は、ISAPI_REDIRECT モジュールに渡す前に、ファイル/ディレクトリが実際に存在することを確認するために書き換えを利用することです。
Thomas が提案したソフトウェアはうまくいくはずでしたが、私はそれを 64 ビットの Windows 2012 R2 マシンにインストールすることができませんでした。しかし、IIS8 (およびおそらくそれ以前のバージョン) に含まれている URL 書き換えモジュールを使用するようにフォールバックすることができました。
解決策を提供する以下の web.config エントリを参照してください。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<httpErrors>
<remove statusCode="404" subStatusCode="-1" />
</httpErrors>
<rewrite>
<rules>
<rule name="404 HTTP">
<match url="(.*)" />
<conditions>
<add input="{REQUEST_URI}" pattern="CFFileServlet/(.*)" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
<add input="{SERVER_PORT_SECURE}" pattern="0" />
</conditions>
<action type="Rewrite" url="/404.cfm?404;http://{HTTP_HOST}:{SERVER_PORT}{REQUEST_URI}" />
</rule>
<rule name="404 HTTPS">
<match url="(.*)" />
<conditions>
<add input="{REQUEST_URI}" pattern="CFFileServlet/(.*)" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
<add input="{SERVER_PORT_SECURE}" pattern="1" />
</conditions>
<action type="Rewrite" url="/404.cfm?404;https://{HTTP_HOST}:{SERVER_PORT}{REQUEST_URI}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
上記の設定ファイルでは、HTTP と HTTPS の両方のリクエストが考慮されています。また、ColdFusion が一時的なイメージとアセットをホストするために使用する CFFileServlet ディレクトリも考慮されます。URL がこのディレクトリで始まる場合、通常のリクエストとして渡されます。
ご意見をお寄せいただきありがとうございます。