3

次のようなサーバーのセットアップがあります。

  • 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 がこのディレクトリで始まる場合、通常のリクエストとして渡されます。

ご意見をお寄せいただきありがとうございます。

4

3 に答える 3

3

注: 上記の質問には解決策も含まれています。

これは Coldfusion Connector のエラーだと思います。アドビ ( https://bugbase.adobe.com/ ) にバグ レポートを投稿します。ただし、回避策があります。私は同じ問題を抱えていますが、IIRF (Ionic IIS Redirector - http://iirf.codeplex.com/ ) を使用しており、それを使用してバグを回避する方法を見つけました。

  1. IIS/Coldfusion の以前の 404 ファイル構成を削除します
  2. インストール手順に従って、IIRF を通常どおりにインストールします。
  3. IirfGlobal.ini ファイル (通常は C:\Windows\System32\inetsrv\IIRF にあります) に、次の行を追加します。

    RewriteFilterPriority HIGH
    

    これにより、IIRF は ColdFusion/Tomcat に到達する前に 404 リクエストを処理できます。

  4. サイト固有の Iirf.ini (通常、Web ファイルのルート フォルダーに作成します。詳細については、IIRF ドキュメントを参照してください) で、次のルールを追加します。

    RewriteCond %{SCRIPT_TRANSLATED} !-f
    RewriteCond %{SCRIPT_TRANSLATED} !-d
    RewriteRule ^(.+)$ page_to_redirect_to.cfm?404;$1 [L]
    

    これにより、存在しないすべてのファイル/ディレクトリが page_to_redirect_to.cfm にリダイレクトされ、通常どおり 404 クエリ文字列が追加されます。

  5. 編集: 次の手順を追加しました: IIS マネージャーに移動し、IIRF を使用するように構成されたサーバーまたは Web サイトを選択してから、ISAPI フィルター セクションに移動します。[View Ordered List] をクリックし、IIRF フィルターを一番上に移動します。

編集 2: Adob​​eにバグを投稿しました。https://bugbase.adobe.com/index.cfm?event=bug&id=3630245を参照してください。

それが役立つことを願っています。

于 2013-09-10T17:35:36.003 に答える