Windows-Server-2008

在 IIS 7 中執行 CGI 以使用 GET 而不需要 POST 請求

  • February 8, 2013

我正在嘗試將舊的 CGI 應用程序從現有的 Windows 2003 伺服器 (IIS 6.0) 遷移到新的 Windows 2008 伺服器與 IIS 7.0,我們遇到以下問題:

在設置模組處理程序和所有內容之後,我發現如果我通過 POST 請求(從另一個頁面送出表單)呼叫它,我只能訪問 CGI 應用程序(rdbweb.exe)文件。

如果我只是嘗試輸入文件的 URL(發出 GET 請求),我會收到以下錯誤:

HTTP 錯誤 502.2 - 網關錯誤

指定的 CGI 應用程序因未返回完整的 HTTP 標頭集而行為異常。它確實返回的標頭是“模組 rdbweb.exe 中的異常 EInOutError,位於 00039B44。I/O 錯誤 6。”。

對於我們的一位客戶來說,這是一個非常古老的應用程序。當我們試圖打電話給供應商時,他們說我們需要支付大約 3000 美元的年度支持費才能開始討論它。我當然想避免這種情況!

注意:

  • 如果我們創建一個送出給“rdbweb.exe”的普通 HTML 表單,我們就可以讓 CGI 正常工作。我們不能將其用作解決方法,因為應用程序中的某些頁面連結到“rdbweb.exe”,而普通連結不是表單送出。
  • 如果我們執行“rdbweb.exe”。從控制台(命令提示符)視窗而不是 IIS,我們得到了我們通常期望的正常 HTML,沒問題。

我們嘗試了以下方法:

  • 確保映射到 IIS 中“rdbweb.exe”的 CGI 模組啟用了所有權限(讀取、寫入、執行),並且所有動詞都被允許,而不僅僅是特定的動詞,還嘗試顯式地允許 GET、POST。
  • 確保應用程序 bool 已將“啟用 32 位應用程序”設置為 true。確保網站使用對“rdbweb.exe”文件和整個網站具有完全權限的帳戶執行(儘管我們知道“讀取”、“執行”就足夠了)。
  • 確保“ISAPI 和 CGI​​ 限制”的機器範圍 IIS 設置具有“rdbweb.exe”.allowed 的完整路徑。
  • 將模組從 CGI 更改為 Fast CGI,也不起作用
  • 確保我們擁有最新的 Windows 更新(對於 IIS6,我們發現知識庫文章指出需要對 IIS6 進行熱修復的錯誤,但沒有發現任何類似的 IIS7)。

現在,我們鼓動的唯一剩下的可能性是以下 Microsoft 知識庫文章: 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 上嘗試它的等效配置。

很快:它可能是使用 D2007 上次更新 (11.0.2902.10471) 之前的 Delphi 版本編譯的 Delphi CGI 應用程序。如果是這種情況,您需要原始碼和 Delphi 安裝並重新編譯應用程序。或者,您應該要求他們使用最新的 Delphi 版本重新編譯應用程序。

(來自http://forums.iis.net/t/1100323.aspx?PageIndex=2

我們發現了導致我們的 CGI 在 IIS 7 上沒有響應的問題。我們實際上將原因縮小到用 Delphi 編寫的所有 CGI 應用程序的基類中的一行程式碼(至少到 2005 版)。這行程式碼在 TCGIApplication 的 Run 方法中,只是簡單地重置標準輸入。在 IIS 6 和更早版本上,此行執行沒有問題,但在 IIS 7 上引發異常,導致 CGI 應用程序崩潰,因此不響應請求。我們仍在調查評論這條線的副作用,但這是我們目前的解決方案。通過刪除這一行,我們的 CGI 應用程序現在可以在 IIS 7 上正確執行。

原作者:史蒂文

引用自:https://serverfault.com/questions/130423