介绍

CGI(通用网关接口)定义了 Web 服务器与外部内容生成程序(通常称为 CGI 程序或 CGI 脚本)交互的一种方式。

在 Tomcat 中,当使用 Tomcat 作为 HTTP 服务器并需要 CGI 支持时,可以添加 CGI 支持。 通常,这是在开发过程中,不想运行像 Apache httpd 这样的 Web 服务器时完成的。 Tomcat 的 CGI 支持与 Apache httpd 的 CGI 支持在很大程度上兼容,但存在一些限制(例如,只有一个 cgi-bin 目录)。

CGI 支持是使用 servlet 类 org.apache.catalina.servlets.CGIServlet 实现的。 传统上,此 Servlet 映射到 URL 模式“/cgi-bin/*”。

默认情况下,在 Tomcat 中禁用 CGI 支持。

安装

注意 - CGI 脚本用于执行 Tomcat JVM 外部的程序。

要启用 CGI 支持:

  • 在默认的 $CATALINA_BASE/conf/web.xml 文件中,有注释掉的 CGI servlet 的示例 servlet 和 servlet-mapping 元素。 要在 Web 应用程序中启用 CGI 支持,请将该 servlet 和 servlet 映射声明复制到 Web 应用程序的 WEB-INF/web.xml 文件中。

取消注释 $CATALINA_BASE/conf/web.xml 文件中的 servlet 和 servlet 映射将同时为所有已安装的 Web 应用程序启用 CGI。

  • 在 Web 应用程序的 Context 元素上设置 privileged="true"

仅允许标记为特权的上下文使用 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 - 命令行参数是否根据 3875 RFC 的第 4.4 节从查询字符串生成?默认值为 false

  • environment-variable- 要为 CGI 脚本的执行环境设置的环境。变量的名称取自参数名称。要配置名为 FOO 的环境变量,请配置名为 environment-variable-FOO 的参数。参数值用作环境变量值。默认值为 no environment variables。

  • 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 环境变量中的脚本。