这算不算是IIS的Bug呢?
缘起
用过IIS的朋友可能都有这样的经历,一个再Unix系统下运行好好的Perl-CGI程序
,拿到IIS中就出了问题,问题一般就出在require或open函数上。但是在命令行
下运行,又不会出问题。以前论坛中也有这样的问题,大家认为一个比较好的解
决办法是将perl_CGI所在的目录加入到@INC中,这样就可以解决问题,也不影响
此程序拿到Unix系统下使用。
我的运行环境
1、Windows2000(With SP2)+IIS5
2、ActivePerl 5.6.1
3、创建目录k:\inetpub\cgi-bin,在IIS中添加虚拟目录cgi-bin,并将其指向
K:\inetpub\cgi-bin目录,然后在cgi-bin目录的属性对话框中的目录页中,点击
“创建”,“配置”使该目录中的以.cgi或.pl文扩展名的文件被perl.exe解析。
4、创建目录k:\inetpub\cgi-bin\test作为本次试验的目录。
分析
但是为什么会这样呢?我曾经以为这是Perl从Unix平台移植到Windows平台的后遗
症。可是,在命令行下程序却运行的好好的,问题应该是出在IIS上。于是,我写
了一个小程序来看看能从当前目录中读出多少文件:
#!/usr/bin/perl
print "content-type:text/html\n\n";
opendir(DIR,".");
while ($file = readdir(DIR)) {
print "$file\n";
}
closedir(DIR);
exit(0);
在命令行下运行没有什么问题,而在IIS中运行后,返回浏览器的内容却是完全不
同的内容,返回的竟然是K:\inetpub\cgi-bin中的内容,难道当前目录是
K:\inetpub\cgi-bin,可是一般的习惯,当前目录应该是文件所在目录才对呀。
再写个程序测试一下:
#! /usr/bin/perl
print "content-type:test/html\n\n";
$path=system('cd');
print "$path \n";
exit(0);
果然,当前目录是K:\inetpub\cgi-bin而不是文件所在的
K:\inetpub\cgi-bin\test目录。
在创建几个子目录,将程序拷到子目录中再测试,结果是一样的,无论文件在哪
个子目录中,在IIS中运行时,其当前目录都是K:\inetpub\cgi-bin,也就是配置
的目录。
原来问题在这里
也就是说,在IIS中,CGI程序的当前目录并不是脚本文件所在的目录。这是不是
有点问题呢?
讨论
去到http://www.w3c.org/CGI/去找找CGI的相关标准,找到了:The CGI/1.1
Specification::CGI/1.1 Revision 03
(http://cgi-spec.golux.com/draft-coar-cgi-v11-03-clean.html)。
在8.2. Recommendations for Servers 中有:
Where applicable, servers SHOULD set the current working directory to
the directory in which the script is located before invoking it.
原来这只是建议(Recommendation),是SHOULD而不是MUST,所以IIS就没有遵守
它。
这算不算IIS的Bug呢?