Apache 2.0手册中文版翻译项目 [本文译者: kajaa * ]

项目说明 | 项目进度 | 项目讨论区 | Apache手册中文版

 


CGI环境中PATH_INFO的改变 - Apache HTTP服务器
<-
Apache主站 > HTTP服务器 > 文档 > 2.0版本

CGI环境中PATH_INFO的改变


现有的语种:  en  |  ja  |  ko 

在Apache 1.1.1及其早期版本中,Apache建立CGI环境中PATH_INFO的方法不太好, 在某些情况下可能导致崩溃。在Apache 1.2版本或更新版本中改变了这种方法, 兼容CGI/1.1规范,使CGI脚本的修改更容易,但会不兼容某些传统的CGI应用(参见这里)。

top

问题

在Apache 1.1.1及其早期版本中,是参照文件名而不是URL来建立环境变量 PATH_INFO和SCRIPT_NAME的,其值在多数情况下正确的,但是如果文件系统路径信息超载, 则结果是不确定的。如果配置文件中有如下设置:

Alias /cgi-ralph /usr/local/httpd/cgi-bin/user.cgi/ralph

这里,user.cgi是CGI脚本,"/ralph"信息会被传递给CGI。 当收到"/cgi-ralph/script/"请求时,代码会设置PATH_INFO为"/ralph/script", SCRIPT_NAME为"/cgi-"。显然,后者是错误的,在某些情况下,会导致服务器崩溃。

top

解决方案

在Apache 1.2版本或更新版本中,则直接参照URL来确定SCRIPT_NAME和PATH_INFO的值, 且判断URL的客户端可修改程度以设置PATH_INFO的值。 对上述例子,PATH_INFO就会被设置为"/script", 而SCRIPT_NAME会被设置为"/cgi-ralph"。 如此,可以避免服务器行为错误,也可以确保 "http://$SERVER_NAME:$SERVER_PORT$SCRIPT_NAME$PATH_INFO" 始终是一个指向正确脚本的有效的URL,而在Apache早期版本中并不能确保。

然而,Alias指令中的信息"/ralph"却很不幸地丢失了。 但是,我们认为使用文件系统来传递这种信息并不可取,脚本也不应该如此运作, Apache 1.2b3以后提供了变通手段

top

对早期服务器的兼容

为Apache或其他服务器设计的脚本可能必须要有一个设置为原来的值的PATH_INFO变量。 为此,Apache 1.2(1.2b3或更新)版本增加了一个变量,FILEPATH_INFO,其值与Apache 1.1.1 中PATH_INFO的值相同。

只要简单地判断是否存在FILEPATH_INFO,如果有就用这个, 脚本在Apache 1.2和早期版本中就都能正常运作。例如,用Perl语言可以这样写:

$path_info = $ENV{'FILEPATH_INFO'} || $ENV{'PATH_INFO'};

如此,脚本就可以在所有支持CGI/1.1规范的服务器和Apache的所有版本中正常运作。

现有的语种:  en  |  ja  |  ko 

 


项目维护者: kajaa [本文译者: kajaa * ]

项目说明 | 项目进度 | 项目讨论区 | Apache手册中文版