web server apache tomcat11-14-CGI

老马啸西风發表於2024-04-22

前言

整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。

開源專案

從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。

系列文章

web server apache tomcat11-01-官方文件入門介紹

web server apache tomcat11-02-setup 啟動

web server apache tomcat11-03-deploy 如何部署

web server apache tomcat11-04-manager 如何管理?

web server apache tomcat11-06-Host Manager App -- Text Interface

web server apache tomcat11-07-Realm Configuration

web server apache tomcat11-08-JNDI Resources

web server apache tomcat11-09-JNDI Datasource

web server apache tomcat11-10-Class Loader

...

Introduction

CGI (Common Gateway Interface) 定義了 Web 伺服器與外部內容生成程式(通常稱為 CGI 程式或 CGI 指令碼)互動的方式。

在 Tomcat 中,當您將 Tomcat 用作 HTTP 伺服器並且需要 CGI 支援時,可以新增 CGI 支援。通常在開發期間進行這樣的操作,當您不想執行諸如 Apache httpd 等網路伺服器時。Tomcat 的 CGI 支援與 Apache httpd 的相容性很高,但有一些限制(例如,只有一個 cgi-bin 目錄)。

CGI 支援是使用 servlet 類 org.apache.catalina.servlets.CGIServlet 實現的。傳統上,將此 servlet 對映到 URL 模式 "/cgi-bin/*"。

預設情況下,Tomcat 中禁用了 CGI 支援。

安裝

注意 - CGI 指令碼用於執行 Tomcat JVM 外部的程式。

要啟用 CGI 支援:

在預設的 $CATALINA_BASE/conf/web.xml 檔案中有註釋的示例 servlet 和 servlet-mapping 元素,用於 CGI servlet。要在 Web 應用程式中啟用 CGI 支援,請將該 servlet 和 servlet-mapping 宣告覆制到 Web 應用程式的 WEB-INF/web.xml 檔案中。

取消註釋 $CATALINA_BASE/conf/web.xml 檔案中的 servlet 和 servlet-mapping 可以一次為所有已安裝的 Web 應用程式啟用 CGI。

在您的 Web 應用程式的 Context 元素上設定 privileged="true"。

只有標記為特權的 Context 才允許使用 CGI servlet。請注意,修改全域性的 $CATALINA_BASE/conf/context.xml 檔案會影響所有 Web 應用程式。有關詳細資訊,請參閱 Context 文件。

配置

有幾個 servlet init 引數可用於配置 CGI servlet 的行為。

  • cgiMethods - 逗號分隔的 HTTP 方法列表。使用這些方法之一的請求將被傳遞給 CGI 指令碼以生成響應。預設值為 GET,POST。使用 * 可以使指令碼處理所有請求,而不管方法如何。除非被該引數的配置覆蓋,否則使用 HEAD、OPTIONS 或 TRACE 的請求將由超類處理。
  • cgiPathPrefix - CGI 搜尋路徑將從 web 應用程式根目錄 + File.separator + 此字首開始。預設情況下沒有值,這將導致將 web 應用程式根目錄用作搜尋路徑。建議的值是 WEB-INF/cgi。
  • cmdLineArgumentsDecoded - 如果啟用了命令列引數(透過 enableCmdLineArguments)並且 Tomcat 在 Windows 上執行,則每個解碼的命令列引數必須匹配此模式,否則請求將被拒絕。這是為了防止已知問題從 Java 傳遞命令列引數到 Windows。這些問題可能導致遠端程式碼執行。有關這些問題的更多資訊,請參閱 Markus Wulftange 的部落格和 Daniel Colascione 的存檔部落格。
  • cmdLineArgumentsEncoded - 如果啟用了命令列引數(透過 enableCmdLineArguments),則每個已編碼的命令列引數必須匹配此模式,否則請求將被拒絕。預設匹配 RFC3875 定義的允許值,格式為 [\w\Q%;/?😡&,$-.!~*'()\E]+。
  • enableCmdLineArguments - 是否從查詢字串生成命令列引數,參見 RFC 3875 第 4.4 節?預設值為 false。
  • environment-variable- - 要設定為 CGI 指令碼執行環境的環境。變數的名稱取自引數名稱。要配置名為 FOO 的環境變數,請配置名為 environment-variable-FOO 的引數。引數值將用作環境變數值。預設情況下沒有環境變數。
  • executable - 用於執行指令碼的可執行檔案的名稱。如果指令碼本身是可執行的(例如,exe 檔案),則可以將此引數明確設定為空字串。預設為 perl。
  • executable-arg-1、executable-arg-2 等 - 可執行檔案的其他引數。這些引數在 CGI 指令碼名稱之前。預設情況下沒有其他引數。
  • envHttpHeaders - 用於選擇作為環境變數傳遞給 CGI 程序的 HTTP 標頭的正規表示式。請注意,在匹配之前標頭會轉換為大寫,並且整個標頭名稱必須與模式匹配。預設值為 ACCEPT[-0-9A-Z]*|CACHE-CONTROL|COOKIE|HOST|IF-[-0-9A-Z]*|REFERER|USER-AGENT
  • parameterEncoding - 用於 CGI servlet 的引數編碼的名稱。預設值為 System.getProperty("file.encoding","UTF-8")。即系統預設編碼,如果該系統屬性不可用,則為 UTF-8。
  • passShellEnvironment - 是否應將來自 Tomcat 程序的 shell 環境變數(如果有)傳遞給 CGI 指令碼?預設為 false。
  • stderrTimeout - 在終止 CGI 程序之前等待讀取 stderr 完成的時間(以毫秒為單位)。預設為 2000。

執行的 CGI 指令碼取決於 CGI Servlet 的配置以及請求如何對映到 CGI Servlet。CGI 搜尋路徑從 web 應用程式根目錄 + File.separator + cgiPathPrefix 開始。然後搜尋 pathInfo(如果不為 null),否則搜尋 servletPath。

搜尋從第一個路徑段開始,並逐個擴充套件一個路徑段,直到不再剩餘路徑段(導致 404)或找到指令碼。任何剩餘的路徑段都將作為 PATH_INFO 環境變數傳遞給指令碼。

參考資料

https://tomcat.apache.org/tomcat-11.0-doc/cgi-howto.html

相關文章