web-dev-qa-db-ja.com

IIS 7でCGIを実行して、要求なしでGETを操作するPOST Request

古いCGIアプリケーションを、正常に動作する既存のWindows 2003サーバー(IIS 6.0)からIIS 7.0)の新しいWindows2008サーバーに移行しようとしています。問題:

モジュールハンドラーとすべてを設定した後、CGIアプリケーション(rdbweb.exe)ファイルにアクセスできるのは、POSTリクエスト(別のページからのフォーム送信))を介して呼び出した場合のみです。 。

ファイルのURLを入力しようとすると(GETリクエストを発行)、次のエラーが発生します。

HTTPエラー502.2-ゲートウェイが正しくありません

指定されたCGIアプリケーションは、HTTPヘッダーの完全なセットを返さないために誤動作しました。返されたヘッダーは、「モジュールrdbweb.exeの0000003B44での例外EInOutError。I/ Oエラー6」です。

これは、クライアントの1人にとって非常に古いアプリケーションです。私たちがベンダーに電話をかけようとしたとき、彼らはそれについての話を始めるために私たちが〜3000ドルの年間サポート料金を支払う必要があると言いました。もちろん、私はそれを避けようとしています!

ご了承ください:

  • 「rdbweb.exe」に送信する通常のHTMLフォームを作成すると、CGIが正常に機能するようになります。ただし、アプリケーション内の一部のページが通常のリンクで「rdbweb.exe」にリンクしているため、これを回避策として使用することはできません。
  • 「rdbweb.exe」を実行した場合。 IISではなくコンソール(コマンドプロンプト)ウィンドウから、通常期待される通常のHTMLを取得します。問題はありません。

私たちは以下を試しました:

  • 「rdbweb.exe」にマップされたCGIモジュールを確認します。inIISすべてのアクセス許可(読み取り、書き込み、実行)が有効になり、特定の動詞だけでなくすべての動詞が許可され、GETも許可されます。 POST明示的に。
  • アプリケーションboolで「32ビットアプリケーションを有効にする」がtrueに設定されていることを確認します。 「rdbweb.exe」.fileおよびWebサイト全体に対する完全なアクセス許可を持つアカウントでWebサイトが実行されるようにします(「読み取り」、「実行」で十分です)。
  • マシン全体のIIS「ISAPIおよびCGIの制限」の設定に「rdbweb.exe」.allowedへのフルパスがあることを確認します。
  • モジュールをCGIからFastCGIに変更し、機能しない
  • 最新のWindowsUpdateがあることを確認します(IIS6の場合、IIS6のホットフィックスが必要なバグを記載したナレッジベースの記事が見つかりましたが、IIS7では同様のものは見つかりませんでした)。

現在、私たちが提起した唯一の残りの可能性は、次のマイクロソフトサポート技術情報の記事です。 http://support.Microsoft.com/kb/145661 -これについては次のとおりです。

CGIエラー:指定されたCGIアプリケーションは、HTTPヘッダーの完全なセットを返さないために誤動作しました。返されたヘッダーは次のとおりです。

この記事では、次の解決策を提案しています。

CGIアプリケーションヘッダー出力のソースコードを変更します。以下は、正しいヘッダーの例です。

 print "HTTP/1.0 200 OK\n";  
 print "Content-Type: text/html\n\n\n";

残念ながら、これを試すためのソースがありません。とにかく、これが私たちが抱えている問題であるかどうかはわかりません

この問題について私を助けてくれませんか? POSTリクエストを必要とせずにアプリケーションを機能させる方法はありますか?古いIIS6サーバーでは、アプリケーションは正常に機能しており、特別なIIS IIS7で同等のものを試してみたい構成。

2
Meligy

間もなく:D2007の最終更新(11.0.2902.10471)より前のDelphiバージョンでコンパイルされたDelphiCGIアプリケーションである可能性があります。その場合は、ソースとDelphiのインストールが必要であり、アプリケーションを再コンパイルします。または、最新のDelphiバージョンを使用してアプリを再コンパイルするように依頼する必要があります。

http://forums.iis.net/t/1100323.aspx?PageIndex=2 から)

CGIがIIS 7で応答しない原因となっている問題を発見しました。実際には、Delphiで記述されたすべてのCGIアプリケーションの基本クラスのコード行に理由を絞り込みました(少なくともこのコード行はTCGIApplicationのRunメソッドにあり、標準入力をリセットするだけです。IIS 6以前では、この行は問題なく実行されますが、IIS 7は例外を発生させ、CGIアプリケーションがクラッシュするため、リクエストに応答しません。この行をコメントアウトすることの副作用を調査中ですが、これが現在の解決策です。この行を削除することにより、CGIアプリケーションはIIS 7で正しく実行されています。

原作者:スティーブン

3
marius

IIS 7で同じ問題が発生したDelphi5 CGIアプリケーションがあります。私たちのソリューションは、上記のStevenが投稿したものと同様でしたが、mariusが上記で言及した行を完全にコメントアウトしていません。 。私が行ったとき、Request.ContentStringステートメントがアプリケーションに空の文字列を返すことを確認しました。私たちの解決策は、下部にある この記事 で提案されたコード修正を実装することでした。これは、変更を加えたCGIApp.pasのコピーを抜粋したコードです。

procedure TCGIApplication.Run;
var
  HTTPRequest: TCGIRequest;
  HTTPResponse: TCGIResponse;
begin
  inherited Run;
  if IsConsole then
  begin
    Rewrite(Output);
    //Win 7/2008 IIS7
    //Reset(Input);
    {$i-} {!!IIS7}
    Reset(Input);
    if IOResult <>0 then ;
    {$i+}
  end;
  try
    HTTPRequest := NewRequest;
    try
      HTTPResponse := NewResponse(HTTPRequest);
      try
        HandleRequest(HTTPRequest, HTTPResponse);
      finally
        HTTPResponse.Free;
      end;
    finally
      HTTPRequest.Free;
    end;
  except
    HandleServerException(Exception(ExceptObject), FOutputFileName);
  end;
end;
3

CGIベンダーは、アプリケーションがIIS 7.0と互換性がなく、将来のリリースでサポートされることを確認しました。

これは、Microsoftナレッジベースの記事に記載されているコードの変更が唯一の修正であることを示唆していると思います。

0
Meligy

この問題が発生し(CGI GETがDelphiで生成されたCGIで機能しない)、. exeではなく.cgi拡張子をCGIに残したかった(ユーザーを怖がらせる!)。 IIS 7.5では、CGIに.exeまたは.dll以外の拡張子を付けることができないようです。

これはPHP(!)を含む非常に巧妙な回避策です:

基本的に、PHPを使用してCGIを呼び出し、結果をエコーバックします。

IIS構成で、*。phpと同じように* .cgiをphpにマップします。 CGIを呼び出す代わりに、次のPHPコードを使用して.cgiファイルを直接呼び出します。

<?php

putenv('QUERY_STRING=' . $_SERVER['QUERY_STRING']);
echo system('C:... path your cgi...//...delphicgi.exe');

?>

'C:... path your cgi ... // ... delphicgi.exe'を元のDelphiCGIに置き換えます。

あります!ユーザーは違いに気付かないはずです。明らかに、PHPを経由することによるパフォーマンスへの影響があります。ただし、少なくともCGIを再構築する必要はなく、.cgi拡張子を付けることができます。

0
Mark Mather