faqs.org-互联网常见问题档案

RFC 3875:通用网关接口(CGI)1.1版


或按编号显示文档



D.Robinson网络工作组征求意见:3875 K.Coar类别:信息Apache软件基金会2004年10月通用网关接口(CGI)1.1版此备忘录的状态本备忘录为互联网社区提供信息。确实如此未指定任何类型的互联网标准。本文件的分发备忘录是无限的。版权声明版权所有(C)互联网协会(2004)。IESG注释本文档不适用于任何级别的Internet标准。IETF不承认本文件适用于任何目的,特别是注意到它尚未进行IETF审查安全、拥塞控制或不适当与部署的协议交互。RFC编辑器已选择自行决定出版这份文件。本文档的读者在评估其实施价值时应谨慎和部署。摘要公共网关接口(CGI)是一个用于运行的简单接口信息服务器下的外部程序、软件或网关以独立于平台的方式。目前,支持信息服务器是HTTP服务器。自1993年以来,该接口一直由World-Wide Web(WWW)使用。本规范定义了在美国国家实验室开发并记录的“CGI/1.1”接口超级计算应用中心。本文件还定义了在UNIX(R)和其他类似系统上使用CGI/1.1接口系统。目录1.简介。41.1. 目的。41.2. 要求。41.3. 规格。41.4. 术语。52.符号惯例和通用语法。52.1、。增强BNF。52.2. 基本规则。62.3. URL编码。73.调用脚本。83.1. 服务器职责。83.2、。脚本选择。93.3. 脚本-URI。93.4. 执行。104.CGI请求。104.1. 请求元变量。104.1.1、。身份验证类型。114.1.2.  内容_长度。124.1.3.  内容_类型。124.1.4.  网关接口。134.1.5.  路径信息。134.1.6.  传输的路径。144.1.7。查询_字符串。154.1.8.  远程_ DDR。154.1.9.  远程暂停。164.1.10. 远程_标识。164.1.11. 远程用户。164.1.12. 请求_方法。174.1.13. 脚本名称。174.1.14. 服务器名称。174.1.15. 服务器端口。184.1.16. 服务器_ PROTOCOL。184.1.17. 服务器软件。194.1.18. 协议特定元变量。194.2. 请求消息正文。204.3. 请求方法。204.3.1、。得到。204.3.2.  邮政。214.3.3.  头部。214.3.4.  协议特定方法。214.4. 脚本命令行。215.NPH脚本。225.1. 标识。225.2. NPH响应。226.CGI响应。236.1. 响应处理。236.2. 响应类型。236.2.1.  文件响应。236.2.2.  本地重定向响应。246.2.3.  客户端重定向响应。246.2.4.  带有文档的客户端重定向响应。246.3. 响应标题字段。256.3.1.  内容类型。256.3.2.  位置。266.3.3.  状态。266.3.4.  协议特定标题字段。276.3.5.  扩展标题字段。276.4条。响应消息-正文。287.系统规范。287.1. 阿米伽多斯。287.2. UNIX。287.3. EBCDIC/POSIX。298.实施。298.1. 服务器建议。298.2. 脚本建议。309.安全注意事项。309.1. 安全方法。309.2. 包含敏感信息的标题字段。319.3. 数据隐私。319.4. 信息安全模型。319.5. 与服务器的脚本冲突。319.6. 数据长度和缓冲注意事项。329.7. 无状态处理。329.8条。相对路径。339.9. 非解析标题输出。3310.确认。3311.参考文献。3311.1. 规范性引用文件。3311.2. 参考文献。3412.作者地址。3513.完整版权声明。361.简介1.1.  目的公共网关接口(CGI)[22]允许HTTP[1]、[4]服务器和CGI脚本共同负责响应客户端请求。客户端请求包含统一资源标识符(URI)[11],一种请求方法和各种辅助方法传输协议提供的有关请求的信息。CGI定义了抽象参数,称为元变量,描述客户的请求。与混凝土一起程序员接口,这指定了一个平台相关接口在脚本和HTTP服务器之间。服务器负责管理连接、数据传输、,与客户端请求相关的传输和网络问题,而CGI脚本处理应用程序问题,例如数据访问以及文档处理。1.2、。要求关键词“必须”、“不得”、“必需”、“应”、“不应”,本节中的“应该”、“不应”、“建议”、“可能”和“可选”文件的解释如BCP 14所述,副本请求2119[3].如果一个实现无法满足一个或多个要求,则该实现不符合要求它实现的协议的“必须”要求。满足所有“必须”和所有其功能的“应该”要求称为“无条件”兼容';满足所有“必须”要求但不满足其功能的所有“应该”要求都是“符合条件”。1.3.  规格并非CGI的所有功能和特性都在本规范的主要部分。以下短语用于描述未指定的功能:'系统定义'不同系统的功能可能不同,但必须相同使用相同系统的不同实现。系统将通常标识一类操作系统。一些系统是定义见本文件第7节。可以定义新系统根据新规范,无需修订本文件。'实现定义'功能的行为可能因实现而异实施;特定的实现必须记录其行为。1.4.  术语本规范使用HTTP/1.1中定义的许多术语规范[4];然而,这里在可能不符合其在该文件中定义的意义,或者具有它们的共同含义。'元变量'一个命名参数,它将信息从服务器传送到脚本。它不一定是操作中的变量系统的环境,尽管这是最常见的实施。'脚本'服务器根据此调用的软件接口。它不需要是独立的程序,但可以是中的动态加载或共享库,甚至子例程服务器。它可能是在运行时解释的一组语句,因为术语“脚本”经常被理解,但这不是要求和本规范上下文中的术语有更广泛的定义。'服务器'调用脚本以便来自客户端的服务请求。2.符号惯例和通用语法2.1.  补充反馈方式本文档中指定的所有机制都在散文和与之类似的扩充巴克斯-努尔形式(BNF)由使用副本请求822[13].  除非另有说明,否则这些元素是区分大小写。这个增强的BNF包含以下内容构件:name=定义规则的名称及其定义由等号分隔字符('=')。空白仅在以下方面有意义定义的续行缩进。“文字”双引号(“)将文本括起来文字引号,由尖括号('<'和'>')。rule1 |规则2可选规则由竖线(“|”)分隔。(规则1规则2规则3)括号中的元素被视为单个元素。*规则以星号('*')开头的规则可以有零个或多个个事件。完整形式为“n*m rule”,表示至少n个规则最多出现m次。n和m是可选的默认值分别为0和无穷大的十进制值。[规则]方括号中的元素(“[”和“]”)是可选的,和等价于“*1规则”。N规则以十进制数字开头的规则正好表示N规则的出现次数。它相当于“N*N规则”。2.2.  基本规则本规范使用了一种类似BNF的语法,定义如下字符。与许多定义字节的规范不同在协议允许的情况下,语法中的每个文字都对应它所代表的角色。如何表示这些字符系统中的位和字节是由系统定义的或在特定上下文中指定。唯一的例外是规则“OCTET”,定义如下。本规范中使用了以下规则描述基本的解析结构。α=低α|hialpha低α=“a”|“b”|“c”|“d”|“e”|“f”|“g”|“h”|“i”|“j”|“k”|“l”|“m”|“n”|“o”|“p”|“q”|“r”|“s”|“t”|“u”|“v”|“w”|“x”|“y”|“z”hialpha=“A”|“B”|“C”|“D”|“E”|“F”|“G”|“H”|“I”|“J”|“K”|“L”|“M”|“N”|“O”|“P”|“Q”|“R”|“S”|“T”|“U”|“V”|“W”|“X”|“Y”|“Z”数字=“0”|“1”|“2”|“3”|“4”|“5”|“6”|“7”|"8" | "9"alphanum=字母|数字OCTET=<任何8位字节>CHAR=字母|数字|分隔符|“!”|“#”|“$”|"%" | "&" | "'" | "*" | "+" | "-" | "." | "`" |“^”|“_”|“{”|”|“|”}“|”~“|CTLCTL=<任何控制字符>SP=<空格字符>HT=<水平制表符>NL=<newline>LWSP=SP|HT|NL分隔符=“(”|“)”|“<”|“>”|“@”|“,”|“;”|“:”|"\" | <"> | "/" | "[" | "]" | "?" | "=" | "{" |“}”|SP|HT标记=1*<除CTL或分隔符之外的任何CHAR>quoted-string=<“>*qdtext<”>qdtext=<除<“>和CTL外的任何CHAR,但包括LWSP>TEXT=<任何可打印字符>注意换行符(NL)不需要是单个控制字符,但可以是一系列控制字符。系统可以将文本定义为是大于<任何CHAR(不包括CTL)的字符集,但包括LWSP>。2.3.  URL译码此处使用的一些变量和构造描述为“URL编码”。该编码在副本请求2396[2].  在URL编码的字符串中,转义序列由百分比字符(“%”)后跟两个十六进制数字,其中两个十六进制数字形成一个八位位组。转义序列表示US-ASCII[9]编码字符集(如果存在)。目前有URI语法中没有用于标识哪个字符集的规定非ASCII代码表示,所以CGI在一个特殊的基础。请注意,某些不安全(保留)字符可能具有不同的编码时的语义。字符的定义不安全取决于上下文;参见第2节加拿大财务报告准则2396[2] ,已更新通过RFC 2732公司[7] ,以获得权威的待遇。这些是保留的字符通常用于为字符串,例如作为字段分隔符。在所有情况下字符串首先根据任何保留字符进行处理显示,然后可以通过替换对生成的数据进行URL解码“%”按字符值转义序列。要对字符串进行编码,请使用所有保留和禁止的字符替换为相应的“%”转义序列。字符串然后可以用于组装URI。保留字符将根据上下文不同而有所不同,但总是从这个集合中提取:保留=“;”|“/”|“?”|“:”|“@”|“&”|“=”|“+”|“$”|"," | "[" | "]"最后两个字符由添加RFC 2732公司[7].  在任何特定上下文中,将保留这些字符的子集;当字符串是在该上下文中进行URL编码的。用于描述的其他基本规则URI语法为:十六进制=数字|“A”|“B”|“C”|“D”|“E”|“F”|“A”|“B”|“c”|“d”|“e”|“f”escaped=“%”十六进制十六进制无保留=字母|数字|标记mark=“-”|“_”|“.”|“!”|“~”|“*”|“'”|“(”|“)”3.调用脚本3.1.  服务器职责服务器充当应用程序网关。它接收请求从客户端,选择一个CGI脚本来处理请求,转换客户机请求到CGI请求,执行脚本并转换将CGI响应转换为客户端的响应。当处理客户端请求,它负责实现任何协议或传输级身份验证和安全性。服务器也可以以“非透明”方式运行,修改请求或响应以提供一些附加服务,例如媒体类型转换或协议简化。服务器必须在本规范要求的客户端请求数据。此外服务器保留其对客户端的责任,以符合即使CGI脚本不符合本规范。如果服务器正在对请求应用身份验证,则必须除非请求通过所有定义的访问,否则不要执行脚本控制。3.2.  编写选择脚本服务器根据客户端提供的通用格式URI。此URI包括组件用“/”分隔的分层路径。对于任何特定请求时,服务器将识别此路径包含单个脚本,因此将脚本放置在路径层次结构中的特定点。路径的其余部分,如果有,是要解释的资源或子资源标识符脚本。有关此路径分割的信息可用于脚本在元变量中,如下所述。支持非层次结构URI方案超出了本规范的范围。3.3.  脚本-URI从客户端请求URI到脚本选择的映射由以下定义特定的服务器实现及其配置。这个服务器可能允许使用一组不同的URI路径层次结构,因此允许替换处理和生成期间此集合的其他成员的URI元变量的。服务器1.可以在特定客户端请求中保留URI;2.它可以从一组可能的值中选择一个规范URI对于每个脚本;3.它可以实现从集合中选择的任何其他URI。从由此生成的元变量中,URI“Script-URI”可以建造。这必须具有以下属性:改为访问此URI,则脚本将被执行SCRIPT_NAME、PATH_INFO和QUERY_STRING的值相同元变量。Script-URI的通用URI结构如下定义见第3节副本请求2396[2] ,但该对象除外不允许使用参数和片段标识符。各种各样的Script-URI的组件由元变量(见下文);script-URI=<scheme>“://”<server-name>“:”<server-port><script-path><extra-path>“?”<query-string>其中<scheme>是从SERVER_PROTOCOL中找到的,<SERVER-name>,<server-port>和<query-string>是各自的元变量。SCRIPT_NAME和PATH_INFO值,URL编码保留“;”、“=”和“?”后,给出<script-path>和<extra-path>。有关PATH_INFO的更多信息,请参阅第4.1.5节元变量。该方案和协议与该方案不相同标识除应用程序协议之外的访问方法。例如,使用传输层安全性(TLS)访问的资源[14] 在使用HTTP协议[19]。CGI/1.1没有为脚本提供通用方法为了重建它,因此定义的Script-URI包括使用的基本协议。然而,脚本可以使用特定于模式的元变量,以更好地推断URI方案。请注意,此定义还允许构造URI将使用任何允许的路径信息值调用脚本或者通过修改适当的组件来查询字符串。3.4.  执行脚本以系统定义的方式调用。除非另有规定否则,包含脚本的文件将作为可执行程序。服务器按说明准备CGI请求第4节;这包括请求元变量(立即执行时可用于脚本)和请求消息数据。这个请求数据无需立即提供给脚本;这个脚本可以在客户端的服务器。脚本的响应返回给第5节和第6节中描述的服务器。如果出现错误情况,服务器可以中断或随时终止脚本执行而不发出警告。那个例如,如果在服务器和客户端;所以脚本应该准备好处理异常终止。4.CGI请求关于请求的信息来自两个不同的来源;这个请求元变量和任何关联的消息正文。4.1.  请求元变量元变量包含有关从服务器传递的请求的数据到脚本,并由系统定义的脚本访问方式。元变量由区分大小写的名称标识;不能有两个不同的变量的名称大小写不同只有。这里使用的是大写字母加下划线(“_”)。特定系统可以定义不同的表现。meta-variable-name=“AUTH_TYPE”|“CONTENT_LENGTH”|“CONTENT_TYPE”|“网关接口”|“PATH_INFO”|“PATH_TRANSLATED”|“QUERY_STRING”|“REMOTE_ADDR”|“REMOTE_HOST”|“REMOTEM_IDENT”|“REMOTE_USER”|“REQUEST_METHOD”|“SCRIPT_NAME”|“服务器名称”|“服务器端口”|“服务器PROTOCOL”|“SERVER_SOFTWARE”|方案|协议var-name |扩展var-nameprotocol-var-name=(协议|方案)“_”var-name方案=alpha*(alpha|digit|“+”|“-”|“.”)var-name=标记extension-var-name=标记与方案同名且名称以开头的元变量协议或方案(例如HTTP_ACCEPT)的名称也是定义。这些变量的数量和含义可能会改变独立于本规范。(另见第4.1.18节。)服务器可以设置其他实现定义的扩展元-变量,其名称应以“X_”为前缀。本规范不区分零长度(NULL)值和缺少的值。例如,脚本无法区分在两个请求之间http://host/script(主机/脚本)http://host/script?因为在这两种情况下QUERY_STRING元变量都将为NULL。meta-variable-value=“”|1*<TEXT、CHAR或值标记>如果可选元变量的值为无效的。元变量值必须视为区分大小写,除非如另有说明。中的字符表示元变量是系统定义的;服务器必须将值转换为该代表。4.1.1.  授权类型AUTH_TYPE变量标识服务器用于对用户进行身份验证。它包含定义的区分大小写的值通过客户端协议或服务器实现。对于HTTP,如果客户端请求外部身份验证访问,则服务器必须从请求授权标头字段中的“auth-scheme”标记。AUTH_TYPE=“”|授权模式auth-scheme=“Basic”|“Digest”|扩展名-authextension-auth=令牌HTTP访问身份验证方案如所述副本请求2617[5].4.1.2.  内容_长度CONTENT_LENGTH变量包含消息正文的大小以十进制八位字节数附加到请求(如果有)。如果没有附加数据,然后为NULL(或未设置)。CONTENT_LENGTH=“”|1*位数当且仅当请求是附带一个message-body实体。CONTENT_LENGTH值必须反映服务器删除后消息正文的长度任何转让代码或内容代码。4.1.3.  内容类型如果请求包含消息正文,则CONTENT_TYPE变量为设置为消息正文的Internet Media Type[6]。CONTENT_TYPE=“”|媒体类型media-type=类型“/”子类型*(“;”参数)type=标记子类型=标记parameter=属性“=”值属性=标记value=token|quoted-string类型、子类型和参数属性名称不是区分大小写。参数值可能区分大小写。媒体类型HTTP/1.1第3.7节描述了它们在HTTP中的使用规范[4]。此变量没有默认值。当且仅当它是取消设置,则脚本可能会尝试从中确定媒体类型接收到的数据。如果类型仍然未知,则脚本可能选择采用application/octet-stream类型,否则可能会拒绝带有错误的请求(如第6.3.3节所述)。每个媒体类型都定义了一组可选和必需的参数。这可能包括具有区分大小写值的字符集参数定义message-body的编码字符集。如果charset参数被省略,则默认值应为根据以下规则中的任何一个导出应用:1.可能有一些系统定义的默认字符集媒体类型。2.“文本”类型的媒体类型的默认值为ISO-8859-1[4]。3.媒体类型规范中定义的任何默认值。4.默认值为US-ASCII。如果HTTP Content-Type字段为存在于客户端请求标头中。如果服务器收到带有附加实体但没有Content-Type头字段的请求可能会尝试确定正确的内容类型,否则会应该省略这个元变量。4.1.4条。网关_接口GATEWAY_INTERFACE变量必须设置为CGI的方言被服务器用来与脚本通信。语法:GATEWAY_INTERFACE=“CGI”“/”1*位数“.”1*位请注意,主要数字和次要数字是分开处理的整数,因此每个整数的增量都可能高于单个整数数字。因此,CGI/2.4的版本低于CGI/2.13,后者反过来低于CGI/12.3。脚本必须忽略前导零并且不得由服务器生成。本文件定义了CGI接口的1.1版本。4.1.5.  路径信息PATH_INFO变量指定CGI要解释的路径脚本。它标识要返回的资源或子资源CGI脚本,并从URI路径的部分派生标识脚本本身的部分后面的层次结构。与URI路径不同,path_INFO不是URL编码的,并且不能包含路径段参数。“/”的PATH_INFO表示单个空心路径段。PATH_INFO=“”|(“/”路径)路径=lsegment*(“/”lsegment)lsegment=*lcharlchar=<任何文本或CTL,“/”>除外该值视为区分大小写,服务器必须保留请求URI中显示的路径的大小写。服务器可以对其允许的值施加限制PATH_INFO,如果遇到错误,可能会拒绝请求任何令人反感的价值观。这可能包括任何请求这将导致编码的“/”被解码为PATH_INFO,如下所示这可能表示脚本丢失了信息。同样,路径中非US-ASCII字符的处理由系统定义。URL编码,PATH_INFO字符串形成的额外路径组件Script_NAME部分后面的脚本URI(见第3.3节)这条路。4.1.6.  传输的路径PATH_TRANSLATED变量由PATH_INFO派生值,将其本身解析为本地URI,并执行任何适合将其映射到服务器的文档存储库结构。字符集结果中允许的是系统定义的。PATH_TRANSLATED=*<任何字符>这是请求访问的文件位置<scheme>“://”<server-name>“:”<server-port><extra-path>其中,<scheme>是原始客户端请求的方案<extra-path>是path_INFO的URL编码版本,带有“;”、“=”和“?”保留。例如,请求如下:http://somehost.com/cgi-bin/somescript/this%2eis%2epath%3binfo将导致PATH_INFO值为/this.is.the.path;信息内部URI由方案、服务器位置和URL编码的PATH_INFO:http://somehost.com/this.is.the.path%3binfo然后将其转换到服务器文档中的某个位置存储库,可能是这样的文件系统路径:/usr/local/www/htdocs/this.is.the.path;信息PATH_TRANSLATED的值是转换的结果。无论该值是否映射到有效的存储库位置。服务器必须保留路径外段,除非基础存储库支持case-不敏感的名称。如果存储库只是案例软件,那么案例-保存服务器,或根据文档名称进行case-blind不需要保留原始段的情况翻译。服务器用于导出PATH_TRANSLATED的转换算法是实施定义的;使用此变量的CGI脚本可能便携性有限。如果请求URI包括path-info组件。如果PATH_INFO为NULL,则PATH_TRANSLATED变量必须设置为NULL(或未设置)。4.1.7.  查询_字符串QUERY_STRING变量包含URL编码的搜索或参数字符串;它向CGI脚本提供信息以影响或改进脚本要返回的文档。RFC第3节描述了搜索字符串的URL语法2396 [2].  QUERY_STRING值区分大小写。QUERY_STRING=查询字符串query-string=*尿液尿液=保留|未保留|转义在分析和解码查询字符串时解析、保留字符和支持非US-ASCII字符取决于上下文。例如,从HTML提交表单文档[18]使用application/x-www-form-urlencoded编码,在其中保留字符“+”、“&”和“=”,以及ISO8859-1编码可用于非US-ASCII字符。QUERY_STRING值提供脚本-URI。(见第3.3节)。服务器必须设置此变量;如果Script-URI不包括查询组件,query_STRING必须定义为空字符串(“”)。4.1.8.  远程_ DDRREMOTE_ADDR变量必须设置为客户端向服务器发送请求。REMOTE_ADDR=主机号主机号=ipv4地址| ipv6地址ipv4地址=1*3位数字“.”1*3位数字“.”1*3位数字“.”1*3位数字ipv6地址=六进制[“:”ipv4地址]hexpart=hexseq |([hexseq]“::”[hexsseq])hexseq=1*4十六进制*(“:”1*4六进制)IPv6地址的格式如所述副本请求3513[15].4.1.9.  远程_停止REMOTE_HOST变量包含的完全限定域名向服务器发送请求的客户端(如果可用),否则无效的。完全限定域名采用中所述的形式第3.5节副本请求1034[17] 以及第2.1节副本请求1123[12].域名不区分大小写。REMOTE_HOST=“”|主机名|主机号主机名=*(域标签“.”)顶部标签[“.”]域标签=字母编号[*字母数字字母编号]toplabel=alpha[*字母数字alphanum]alphahydigit=alphanum|“-”服务器应该设置此变量。如果主机名不是出于性能原因或其他原因,服务器可能替换REMOTE_ADDR值。4.1.10.  远程_标识REMOTE_IDENT变量可用于提供身份信息报告了连接副本请求1413[20] 请求远程代理(如果可用)。服务器可能选择不支持或出于效率原因不请求数据,或不返回可用的身份数据。REMOTE_IDENT=*文本返回的数据可以用于身份验证,但其中的信任级别应该是最低的。4.1.11。远程用户(_U)REMOTE_USER变量提供用户标识字符串作为用户身份验证的一部分由客户端提供。REMOTE_USER=*文本如果客户端请求需要HTTP身份验证[5](例如AUTH_TYPE元变量设置为“基本”或“摘要”),然后REMOTE_USER元变量的值必须设置为用户ID提供。4.1.12.  请求_方法REQUEST_METHOD元变量必须设置为应该由脚本用于处理请求,如中所述第4.3节。REQUEST_METHOD=方法method=“GET”|“POST”|”HEAD“|扩展方法extension-method=“PUT”|“DELETE”|标记该方法区分大小写。HTTP方法如所述HTTP/1.0规范[1]第5.1.1节和HTTP/1.1规范[4]。4.1.13.  脚本_名称SCRIPT_NAME变量必须设置为URI路径(非URL-encoded)可以识别CGI脚本(而不是脚本的输出)。语法与PATH_INFO相同(第4.1.5节)SCRIPT_NAME=“”|(“/”路径)前导“/”不是路径的一部分。如果路径为为空;但是,在这种情况下,必须仍然设置变量。SCRIPT_NAME字符串构成路径组件的一些主要部分以某种实现定义的方式派生的Script-URI。PATH_INFO段(见第4.1.5节)包含在SCRIPT_NAME中值。4.1.14.  服务器名称SERVER_NAME变量必须设置为服务器主机的名称客户端请求被定向到该客户端。它不区分大小写主机名或网络地址。它构成了脚本-URI。SERVER_NAME=服务器名称服务器名称=主机名|ipv4-address|(“[”ipv6-address“]”)部署的服务器可以有多个可能的值变量,其中多个HTTP虚拟主机共享相同的IP地址。在这种情况下,服务器将使用请求主机的内容header字段选择正确的虚拟主机。4.1.15.  服务器端口SERVER_PORT变量必须设置为上的TCP/IP端口号从客户端接收此请求。使用此值在Script-URI的端口部分。SERVER_PORT=服务器端口服务器端口=1*位数请注意,即使端口是默认端口,也必须设置此变量方案的端口,否则可以从URI中省略。4.1.16.  服务器_ PROTOCOLSERVER_PROTOCOL变量必须设置为的名称和版本用于此CGI请求的应用程序协议。这可能不同来自服务器在通信中使用的协议版本与客户合作。SERVER_PROTOCOL=HTTP-Version|“INCLUDED”|扩展-版本HTTP-Version=“HTTP”“/”1*位数“.”1*位extension-version=协议[“/”1*digit“.”1*digit]协议=令牌这里,“协议”定义了一些信息的语法在服务器和脚本之间传递(“特定于协议”功能)。它不区分大小写,通常显示在大写。协议与的方案部分不同脚本URI,它定义了客户端与服务器通信。例如,一个请求使用“HTTP”协议访问脚本可能使用了“https”方案。服务器可能使用的SERVER_PROTOCOL的一个众所周知的值是“INCLUDED”,表示包含当前文档作为复合文档的一部分,而不是直接目标客户端请求的。脚本应将其视为HTTP/1.0请求。4.1.17.  服务器_软件SERVER_SOFTWARE元变量必须设置为名称和版本提出CGI请求的信息服务器软件(以及运行网关)。它应该与服务器相同向客户报告的描述(如有)。SERVER_SOFTWARE=1*(产品|注释)product=令牌[“/”product-version]product-version=令牌comment=“(”*(ctext|comment)“)”ctext=<任何文本,不包括“(”和“)”>4.1.18.  协议特定元变量服务器应设置特定于协议和请求的方案。特定于协议的解释变量取决于SERVER_protocol中的协议版本。这个服务器可以将方案名称的元变量设置为如果方案与协议不同,则返回非NULL值。这个这样一个变量的存在向脚本指示了哪个方案是请求使用。名称以“HTTP_”开头的元变量包含读取的值如果使用的协议是HTTP,则从客户端请求头字段中选择。HTTP头字段名转换为大写,包含所有出现的“-”替换为“_”,并在前面加上“HTTP_”给出元变量名称。标题数据可以表示为由客户端发送,或可以不更改的方式重写它的语义。如果多个标题字段具有相同的字段名称然后服务器必须将其重写为单个值具有相同的语义。类似地,一个跨越多行必须合并为一行。服务器必须,如有必要,更改数据的表示形式(例如字符集)适用于CGI元变量。不需要服务器为所有它接收的标头字段。特别是,它应该删除任何携带身份验证信息的头字段,例如“授权”;或可用于其他变量,如“Content-Length”和“Content-Type”。服务器可以删除仅与客户端相关的标题字段通信问题,如“连接”。4.2.  请求消息-正文请求数据由脚本以系统定义的方法访问;除非另有规定,否则应阅读“标准”input的文件描述符或文件句柄。Request-Data=[Request-body][extension-Data]request-body=<CONTENT_LENGTH>10月扩展数据=*OCTET如果CONTENT_LENGTH为不为NULL。服务器必须至少提供足够多的字节以便阅读脚本。服务器可能发出文件结束信号读取CONTENT_LENGTH字节后的情况,或它可能提供扩展数据。因此,脚本不得试图读取更多内容超过CONTENT_LENGTH字节,即使有更多数据可用。然而,它没有义务读取任何数据。对于非解析头(NPH)脚本(第5节),服务器应该尝试确保提供给脚本的数据是精确的如由客户端提供的并且由服务器不改变。由于请求体不支持传输编码,服务器必须从消息正文中删除任何此类代码,并重新计算内容_长度。如果这不可能(例如,因为大缓冲要求),服务器应拒绝客户端请求。它还可以从消息体中删除内容编码。4.3.  请求方法Request_Method元变量中提供的请求方法,标识中脚本要应用的处理方法产生响应。脚本作者可以选择实现最适合特定应用的方法。如果脚本接收到一个带有不支持它的方法的请求应该错误地拒绝(见第6.3.3节)。4.3.1.  GET(获取)GET方法指示脚本应该生成一个文档基于元变量值。按照惯例,GET方法是“安全”和“幂等”,且不应具有采取除制作文档以外的操作。GET方法的含义可以通过特定于协议的元变量。4.3.2.  邮政POST方法用于请求脚本执行处理和根据请求消息正文中的数据生成文档添加元变量值。常见的用法是在中提交表单HTML[18],旨在通过具有永久影响,如数据库中的更改。脚本必须在之前检查CONTENT_LENGTH变量的值读取附加的消息正文,并应检查CONTENT_TYPE值,然后进行处理。4.3.3.  头部HEAD方法请求脚本对返回响应标头字段,而不提供响应消息正文。脚本不得提供响应消息-正文用于HEAD请求。如果是,则服务器必须丢弃message-body从脚本读取响应时。4.3.4.  协议专用方法脚本可以实现任何特定于协议的方法,例如HTTP/1.1 PUT和DELETE;它应该检查SERVER_PROTOCOL的值进行此操作时。服务器可能认为某些方法不合适,或者允许用于脚本,并且可以处理方法本身或返回客户端出错。4.4.  脚本命令行一些系统支持将字符串数组提供给CGI脚本。这仅在“索引”HTTP的情况下使用查询,由带有URI的“GET”或“HEAD”请求标识不包含任何未编码“=”字符的查询字符串。对于这样的请求,服务器应该将查询字符串视为使用规则搜索字符串并将其解析为单词search-string=搜索字*(“+”搜索字)搜索字=1*scharschar=unreserved|escaped|xreservedxreserved=“;”|“/”|“?”|“:”|“@”|“&”|“=”|“,”|"$"解析后,每个搜索字都经过URL解码,可以选择编码为系统定义的方式,然后添加到命令行参数中列表。如果服务器无法创建参数列表的任何部分,则服务器不得生成任何命令行信息。例如,参数的数量可能大于操作系统或服务器限制,或其中一个单词可能无法表示为参数。脚本应该检查QUERY_STRING值是否包含uncoded“=”字符,不应使用命令行如果是这样的话。5.NPH脚本5.1.  识别服务器可能支持NPH(非解析头)脚本;这些是服务器将所有响应责任传递给的脚本处理。该规范没有提供NPH脚本仅根据其输出数据确定。按照惯例,因此,任何特定脚本都只能提供一个类型(NPH或CGI),因此脚本本身被描述为“NPH脚本”。具有NPH支持的服务器必须提供实现-定义了识别NPH脚本的机制,可能基于脚本的名称或位置。5.2.  NPH响应脚本必须有一个系统定义的方法来发送数据返回到服务器或客户端;脚本必须始终返回一些数据。除非另有规定,否则这将与传统方法相同CGI脚本。目前,NPH脚本仅为HTTP客户端请求定义。(HTTP)NPH脚本必须返回完整的HTTP响应消息,目前在HTTP规范[1]、[4]的第6节中进行了描述。脚本必须使用SERVER_PROTOCOL变量来确定响应的适当格式。它还必须考虑到请求中的通用或特定于协议的元变量由特定协议规范强制执行。服务器必须确保将脚本输出发送到客户端未修改。请注意,这需要脚本使用正确的中的字符集(US-ASCII[9]和ISO 8859-1[10]用于HTTP)标题字段。服务器应该尝试确保脚本输出直接发送到客户端,具有最小的内部和无传输可见缓冲。除非实现另有定义,否则脚本不得在其响应中指出客户端可以发送进一步的请求在同一连接上。6.CGI响应6.1.  响应处理脚本必须始终提供非空响应,因此有一个用于将此数据发送回服务器的系统定义方法。除非另有定义,否则将通过“标准输出”文件描述符。脚本在处理时必须检查REQUEST_METHOD变量请求并准备其响应。服务器可能会实现一个超时时间段,在此时间段内数据必须从脚本收到。如果服务器实现定义了这样一个超时,并且在超时期间没有从脚本接收数据,服务器可能会终止脚本进程。6.2.  响应类型响应包括一个消息头和一个消息体,分开通过空白行。message-header包含一个或多个标头领域。正文可能为NULL。generic-response=1*头字段NL[response-body]脚本必须返回文档响应或本地响应之一重定向响应或客户端重定向(使用可选文档)响应。在下面的响应定义中,标头的顺序响应中的字段不重要(尽管在BNF)。标题字段在第6.3节中定义。CGI-Response=文档响应|本地响应|client-redir-response |客户端-redirdoc-respondse6.2.1.  文件响应CGI脚本可以在文档中向用户返回文档响应,带有指示成功状态的可选错误代码响应的。document-response=内容类型[状态]*其他字段NL反应体脚本必须返回Content-Type头字段。A状态标题字段是可选的,如果省略,则假定状态200为“OK”。服务器必须对脚本的输出以确保对客户端的响应符合响应协议版本。6.2.2.  本地重定向响应CGI脚本可以返回URI路径和查询字符串('local-pathquery')用于Location标头字段中的本地资源。这向服务器指示它应该重新处理请求使用指定的路径。local-redir-response=local-Location-NL脚本不得返回任何其他标题字段或消息正文,服务器必须生成它本来会生成的响应响应包含URL的请求scheme“://”server-name“:”server-port local-pathquery6.2.3.  客户端重定向响应CGI脚本可以在Location标头中返回绝对URI路径字段,以指示客户端应重新处理请求使用指定的URI。client-redir-response=client-Location*扩展字段NL脚本不得提供任何其他标题字段,除了服务器定义的CGI扩展字段。对于HTTP客户端请求服务器必须生成302“找到”HTTP响应消息。6.2.4.  带有文档的客户端重定向响应CGI脚本可以在Location标头中返回绝对URI路径字段和附件,以向客户指示它应该使用指定的URI重新处理请求。client-redirdoc-response=client-Location状态内容类型*其他字段NL响应机构必须提供状态标题字段,并且必须包含状态值302“Found”,或者它可能包含扩展代码,即,另一个表示客户端重定向的有效状态代码。服务器必须对脚本的输出进行任何适当的修改确保对客户端的响应与响应一致协议版本。6.3.  响应标题字段响应头字段是CGI或扩展头字段由服务器或协议特定的头字段解释以包括在返回给客户端的响应中。至少一个必须提供CGI字段;每个CGI字段的显示不得超过只有一次回应。响应头字段的语法为:header-field=CGI-field |其他字段CGI-field=内容类型|位置|状态other-field=协议字段|扩展字段protocol-field=通用字段extension-field=通用字段generic-field=field-name“:”[field-value]NLfield-name=标记field-value=*(field-content|LWSP)field-content=*(标记|分隔符|引用-字符串)字段名称不区分大小写。NULL字段值为相当于未发送字段。请注意,中的每个标题字段CGI-Response必须在单行中指定;CGI/1.1没有支持延续线。“:”之间允许空白和字段值(但不在字段名称和“:”之间),以及也在字段值中的标记之间。6.3.1.  内容类型内容类型响应字段设置的Internet媒体类型[6]实体主体。Content-Type=“Content-Type:”媒体类型NL如果返回实体主体,则脚本必须提供内容类型响应中的字段。如果失败,服务器不应该尝试确定正确的内容类型。该值应为未经修改发送给客户端,但任何字符集参数除外变化。除非系统另有定义,否则默认字符集由如果协议是HTTP,则文本媒体类型的客户端是ISO-8859-1而US-ASCII则不然。因此,脚本应该包含字符集参数。参见HTTP/1.1规范[4]第3.4.1节了解对这个问题的讨论。6.3.2.  位置位置标头字段用于向服务器指定脚本返回对文档的引用,而不是实际的文件(见第6.2.3和6.2.4节)。要么是绝对值URI(可以使用片段标识符),表示客户端将获取引用的文档或本地URI路径(可以使用查询字符串),指示服务器获取引用的文档并将其作为响应。位置=local-Location |客户端-Locationclient-Location=“Location:”fragment-URI NLlocal-Location=“Location:”local-pathquery NLfragment-URI=绝对URI[“#”片段]碎片=*尿液local-pathquery=abs-path[“?”查询字符串]abs-path=“/”路径段path-segments=段*(“/”段)段=*pcharpchar=无保留|转义|额外额外=“:”|“@”|“&”|“=”|“+”|“$”|“,”absoluteURI的语法从中指定的副本请求2396[2] 和RFC 2732公司[7].  有效的绝对URI始终以方案名称开头,后跟“:”;方案名称以字母开头,然后继续使用字母数字、“+”、“-”或“.”。本地URI路径和查询必须是绝对路径,而不是相对路径或NULL,因此必须以“/”开头。请注意,任何附加到请求的消息体(例如POST请求)可能对作为目标的资源不可用重定向的。6.3.3.  状态状态标题字段包含一个3位整数结果代码指示脚本尝试处理请求。Status=“Status:”Status-code SP reason-phrase NLstatus-code=“200”|“302”|“400”|“501”|扩展代码扩展代码=3位reason-phrase=*文本状态代码200“OK”表示成功,是默认值假定为文档响应。使用状态代码302“已找到”带有位置标头字段和响应消息正文。状态代码400“错误请求”可能用于未知的请求格式,例如缺少CONTENT_TYPE。状态代码501“未实施”可能是如果收到不支持的REQUEST_METHOD,则由脚本返回。HTTP第6.1.1节列出了其他有效状态代码规范[1]、[4]以及IANA HTTP状态代码注册表[8] 并可用于所列的以外或替代所列的以上。脚本应该在之前检查SERVER_PROTOCOL的值使用HTTP/1.1状态代码。脚本可能会拒绝,出现错误405使用“不允许使用方法”的方法发出的HTTP/1.1请求不支持。请注意,返回错误状态代码并不一定意味着脚本本身的错误条件。例如,一个脚本被服务器作为错误处理程序调用时应返回代码适合服务器的错误情况。原因措辞是对错误的文本描述返回给客户供人食用。6.3.4.  协议特定标题字段脚本可以返回与SERVER_PROTOCOL规范定义的响应消息(HTTP/1.0[1]或HTTP/1.1[4])。服务器必须翻译标题从CGI头语法到HTTP头语法的数据,如果这些不同。例如,换行符的字符序列(例如CGI脚本使用的UNIX US-ASCII LF)可能与HTTP使用(US-ASCII CR后跟LF)。脚本不得返回任何与客户端通信问题,可能会影响服务器的能够向客户端发送响应。服务器可能会删除客户端返回的任何此类头字段。它应该解决任何脚本和标头返回的标头字段之间存在冲突否则它会发送给自己的字段。6.3.5.  扩展标题字段可能还有其他实现定义的CGI头字段,其字段名应以“X-CGI-”开头。服务器可能会忽略(并删除)名称以“X”开头的任何未识别的标题字段-CGI-“从脚本接收到的。6.4.  响应消息-正文响应消息正文是要返回到的附加文档服务器端的客户端。服务器必须读取所有提供的数据通过脚本,直到脚本发出消息正文结束的信号通过文件结束条件。应发送消息正文未对客户端进行修改,HEAD请求或任何要求的情况除外传输编码、内容编码或字符集转换。response-body=*十月十日7.系统规范7.1.  阿米伽多斯元变量元变量以相同的名称传递给脚本环境变量。这些由DOS库访问例程GetVar()。flags参数应为0。案例是忽略,但建议使用大写字母以与兼容案例敏感系统。当前工作目录脚本的当前工作目录设置为包含脚本的目录。字符集US-ASCII字符集[9]用于定义元变量、标题字段和值;换行符(NL)序列为LF;服务器也应该接受CR LF作为换行符。7.2.  UNIX系统对于与UNIX兼容的操作系统,定义了以下内容:元变量元变量以相同的名称传递给脚本环境变量。它们由C库访问例程getenv()或变量environ。命令行可以使用main()的argc和argv参数来访问。这个单词中有任何在Bourne shell中“活动”的字符用反斜杠转义。当前工作目录脚本的当前工作目录应设置为包含脚本的目录。字符集US-ASCII字符集[9](不包括NUL)用于元变量、标题字段和CHAR值的定义;文本值使用ISO-8859-1。PATH_TRANSLATED值可以包含任何8位字节,NUL除外。换行(NL)序列是LF;服务器还应接受CR LF作为换行符。7.3。EBCDIC/POSIX公司对于使用EBCDIC字符的POSIX兼容操作系统设置,定义如下:元变量元变量以相同的名称传递给脚本环境变量。它们由C库访问例程getenv()。命令行可以使用main()的argc和argv参数来访问。这个单词中有任何在Bourne shell中“活动”的字符用反斜杠转义。当前工作目录脚本的当前工作目录应设置为包含脚本的目录。字符集IBM1047字符集[21](不包括NUL)用于元变量、标题字段、值、TEXT字符串的定义和PATH_TRANSLATED值。换行(NL)序列是LF;服务器还应该接受CR-LF作为换行符。媒体类型字符集默认值文本(和其他实现)的默认字符集值-定义)媒体类型为IBM1047。8.实施8.1。服务器建议虽然服务器和CGI脚本在它们对URL路径的处理(客户端URL和PATH_INFO数据,服务器作者可能希望实现一致性。所以服务器实现应该为以下内容指定其行为案例:1.定义对允许的路径段的任何限制,特别是是否允许非终结NULL段;2.定义“.”或“..”路径段的行为;即。,是否被禁止,视为普通路径段或根据相对URL进行解释规范[2];3.定义实施的任何限制,包括路径或搜索字符串长度,以及对服务器将解析的头字段。8.2.  脚本建议如果脚本不打算处理PATH_INFO数据,则如果PATH_INFO不存在,则应拒绝404 Not Found请求无效的。如果正在处理表单的输出,请检查CONTENT_TYPE是“application/x-www-form-urlencoded”[18]或“multipart/form-data”[16].  如果CONTENT_TYPE为空,脚本可以拒绝请求出现415“不支持的媒体类型”错误协议。分析PATH_INFO、PATH_TRANSLATED或SCRIPT_NAME脚本时应注意空路径段(“//”)和特殊路径段(“.”和“..”)。它们应该从路径中删除在操作系统调用中使用之前,或应使用拒绝请求404“找不到”。当返回头字段时,脚本应该尝试发送CGI标题字段,并应在任何HTTP标头字段。这可能有助于减少服务器的内存要求。脚本作者应该知道REMOTE_ADDR和REMOTE_HOST元变量(见第4.1.8节和第4.1.9节)可能无法识别请求的最终来源。他们确定客户立即向服务器发出请求;该客户端可以是代理、网关、,或代表实际源客户的其他中介机构。9.安全注意事项9.1.  安全方法如HTTP的安全注意事项中所述规范[1]、[4],约定GET和HEAD方法应该是“安全的”和“幂等的”(重复请求具有与单个请求相同的效果)。参见第9.1节属于RFC 2616号文件[4] 进行全面讨论。9.2.  包含敏感信息的标题字段某些HTTP标头字段可能包含敏感信息除非明确配置,否则服务器不应传递给脚本这样做。例如,如果服务器使用基本身份验证方案,然后客户端将发送包含用户名和密码的授权标题字段。这个服务器验证此信息,因此不应传递不小心通过HTTP_AUTHORIZATION元变量输入密码对价。这也适用于Proxy-Authorization标头字段和相应的HTTP_PROXY_AUTHORIZATION元变量。9.3.  数据隐私请求中的机密数据应作为POST请求的一部分,而不是放在URI或消息头中。在某些系统上,用于将元变量传递给脚本可能对其他脚本或用户可见。此外,许多现有服务器、代理和客户端将永久记录URI第三方可能看到的位置。9.4.  信息安全模型对于使用TLS的客户端连接,安全模型适用于客户端和服务器之间,而不是客户端和脚本之间。服务器负责处理TLS会话,因此是对客户端进行身份验证的服务器,而不是CGI脚本。此规范未提供脚本执行以下操作的机制对调用它的服务器进行身份验证。没有强制CGI请求和响应消息的完整性。9.5.  对服务器的脚本干扰最常见的CGI实现将脚本作为子级调用进程使用与服务器进程相同的用户和组。因此,应确保脚本不会干扰服务器进程及其配置、文档或日志文件。如果脚本是通过调用链接到服务器软件(在编译时或运行时),然后采取预防措施应采取措施保护服务器的核心内存,或确保无法执行不受信任的代码。9.6.  数据长度和缓冲注意事项本规范对消息正文的长度没有限制呈现给脚本。脚本不应假定静态分配的任何大小的缓冲区都足以包含一次完成整个提交。固定长度缓冲器的使用如果不仔细进行溢出检查,可能会导致攻击者利用的“stack-smashing”或“stack-overflow”漏洞操作系统。该脚本可能会将大量提交假脱机到磁盘或其他缓冲媒体,但快速连续的大型提交可能导致拒绝服务情况。如果的CONTENT_LENGTH消息体大于资源考虑允许的大小,脚本应以适合协议的错误状态进行响应版本;可能适用的状态代码包括503'服务“不可用”(HTTP/1.0和HTTP/1.1),413“请求实体太大”(HTTP/1.1)和414“请求URI太大”(HTTP/1)。类似的考虑也适用于服务器对CGI的处理脚本的响应。长度没有限制脚本返回的header或message-body;服务器不应假设静态分配的任何大小的缓冲区都足够以包含整个响应。9.7.  无状态处理Web的无状态特性使得每个脚本都可以执行资源检索独立于所有其他资源,即使是多个请求构成单个概念性Web事务。因为这样,脚本就不应该对提交请求的用户代理。特别是,脚本应该检查从客户处获得的数据并验证其有效性,在允许其用于敏感用途,例如输入到其他应用程序、命令或操作系统服务。这些用途包括(但不限于)to)系统调用参数,数据库写入,动态计算源代码,并输入到帐单或其他安全流程。它是保护应用程序免受无效输入的影响无论无效性是否是用户错误的结果,逻辑错误或恶意操作。多请求事务中涉及的脚本的作者应该是对验证状态信息尤其谨慎;危险替代品可能会产生不良影响提交部分的值,否则可能是假定安全。当更改对来自事务的前一阶段的数据意味着由客户端控制(例如,隐藏的HTML表单元素、cookie、嵌入式URL等)。9.8.  相对路径服务器应注意请求中的“..”路径段URI。这些应该在请求URI中删除或解析它被分为脚本路径和额外路径。或者,当额外路径用于查找path_TRANSLATED,应注意避免路径解析提供转换路径超出预期的路径层次结构。9.9.  非解析标题输出如果脚本返回非解析头输出,则由则脚本必须解决所有与该协议相关的安全考虑。10.确认这项工作基于最初的CGI接口关于“www talk”邮件列表的讨论。特别是RobMcCool、John Franks、Ari Lootonen、George Phillips和Tony Sanders他们在定义和实现此接口的早期版本。本文件也从评论和Chris Adie、Dave Kristol和Mike Meyer提出的建议;还有大卫莫里斯、杰里米·马迪亚、帕特里克·麦克马纳斯、亚当·多纳休、罗斯·帕特森和哈拉尔德·阿尔维斯特朗。11.参考文献11.1规范性引用文件[1] Berners-Lee,T.、Fielding,R.和H.Frystyk,“超文本传输协议--HTTP/1.0“,RFC 19451996年5月。[2] Berners-Lee,T.、Fielding,R.和L.Masinter,“统一资源标识符(URI):通用语法“,副本请求23961998年8月。[3] Bradner,S.,“RFC中用于指示需求的关键词级别”,BCP 14,副本请求21191997年3月。[4] Fielding,R.、Gettys,J.、Mogul,J.,Frystyk,H.、Masinter,L.、。,Leach,P.和T.Berners-Lee,“超文本传输协议--HTTP/1.1“,RFC 2616号文件1999年6月。[5] Franks,J.、Hallam Baker,P.、Hostetler,J.、Lawrence,S.、。,Leach,P.、Luotonen,A.和L.Stewart,“HTTP身份验证:基本和摘要访问身份验证“,副本请求26171999年6月。[6] Freed,N.和N.Borenstein,“多用途互联网邮件扩展(MIME)第二部分:媒体类型”,RFC 2046号文件,11月1996[7] Hinden,R.、Carpenter,B.和L.Masinter,“文字格式URL中的IPv6地址“,RFC 2732公司1999年12月。[8] “HTTP状态代码注册表”,http://www.iana.org/assignments/http-status-codes,IANA。[9] “信息系统——编码字符集——7位美式信息交换标准代码(7位ASCII)”,美国国家标准学会INCITS.4-1986(R2002)。[10] “信息技术——8位单字节编码图形字符集第1部分:拉丁字母1“,ISO/IEC8859-1:1998.11.2.  资料性引用[11] Berners-Lee,T.,“WWW中的通用资源标识符:A名称和地址表达的统一语法网络上的对象与World-Wide Web中使用的对象相同“,副本请求1630,1994年6月。[12] Braden,R.,Ed.,“互联网主机的要求——应用和支持”,STD 3,副本请求1123,1989年10月。[13] Crocker,D.,“ARPA互联网文本格式标准消息”,STD 11,副本请求8221982年8月。[14] Dierks,T.和C.Allen,“TLS协议1.0版”,RFC22461999年1月。[15] Hinden R.和S.Deering,“互联网协议版本6(IPv6)寻址体系结构”,副本请求35132003年4月。[16] Masinter,L.,“从表单返回值:多部分/表单数据“,RFC 2388号文件1998年8月。[17] Mockapetris,P.,“域名-概念和设施”,STD13,副本请求10341987年11月。[18] Raggett,D.、Le Hors,A.和I.Jacobs,编辑,“HTML 4.01规范”,W3C建议1999年12月,http://www.w3.org/TR/html401/.[19] Rescola,E.“基于TLS的HTTP”,副本请求28182000年5月。[20] St.Johns,M.,“识别协议”,副本请求1413,2月1993[21]IBM国家语言支持参考手册第2卷,SE09-8002-01,1990年3月。[22]“公共网关接口”,http://hoohoo.ncsa.uiuc.edu/cgi/伊利诺伊大学NCSA。12.作者地址大卫·罗宾逊Apache软件基金会电子邮件:drtr@apache.org肯·A·L·科尔Apache软件基金会电子邮件:coar@apache.org13.完整版权声明版权所有(C)互联网协会(2004)。本文件为主题BCP 78和www.rfc-editor.org,除文中另有规定外,作者保留所有权利。本文件及其所含信息在“按现状”基础和贡献者、他/她代表的组织或由互联网协会和互联网赞助(如有)工程任务组否认所有明示或暗示的担保,包括但不限于使用此处的信息不会侵犯任何权利或任何暗示对适销性或适用于特定目的的保证。知识产权IETF对任何可能要求的知识产权或其他权利与中描述的技术的实现或使用有关本文件或此类权利下的任何许可的范围可能可用或不可用;也不代表它已经做出任何独立努力来确定任何此类权利。问询处ISOC关于ISOC文件中权利的程序见BCP 78和BCP 79。向IETF秘书处披露的知识产权信息副本以及提供许可证的保证,或试图获得使用的一般许可或许可本协议的实施者或用户的此类所有权规范可从IETF在线知识产权库获取,网址为网址:http://www.ietf.org/ipr.IETF邀请任何相关方提请其注意版权、专利或专利申请或其他所有权可能涵盖实施所需技术的权利本标准。请将信息发送给IETF上的IETF-ipr@ietf.org.鸣谢RFC编辑器功能的资金目前由互联网社会。
 

用户贡献:

你好,

SERVER_NAME变量是如何定义的?

我在两台不同的主机上使用相同的apache服务器:
-在活动服务器上SERVER_NAME=主机名
-在测试一中,SERVER_NAME=IP地址

你知道这是从哪里来的吗?

谢谢,
皮埃尔·马顿。
2
Alexey Subbotin公司
2023年4月27日上午5:05
尊敬的开发人员:,

PHP可以通过Node.js运行吗?

真诚的,
阿列克谢

评论此RFC、提出问题或添加有关此主题的新信息: