Apache HTTP服务器 2.0版本
在Apache 1.1.1及其早期版本中,Apache建立CGI环境中PATH_INFO的方法不太好, 在某些情况下可能导致崩溃。在Apache 1.2版本或更新版本中改变了这种方法, 兼容CGI/1.1规范,使CGI脚本的修改更容易,但会不兼容某些传统的CGI应用(参见这里)。
在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-
"。显然,后者是错误的,在某些情况下,会导致服务器崩溃。
在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以后提供了变通手段。
为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的所有版本中正常运作。