前言
整理這個官方翻譯的系列,原因是網上大部分的 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