web server apache tomcat11-14-CGI

前言

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章