这算不算是IIS的Bug呢?

yourway 2002-03-13 11:21:55
缘起
用过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呢?
...全文
81 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
okeyes 2002-03-14
  • 打赏
  • 举报
回复
是也不是,微软就是这样,他就是这样的不遵守规范。他只想别人来遵守他的规范、规则。

你用那个"目录浏览"就可以很清楚的知道,虚拟目录与apache的不同。
yourway 2002-03-14
  • 打赏
  • 举报
回复
是呀,微软是畅快了,可是我们写程序就累了。
RobinCat 2002-03-13
  • 打赏
  • 举报
回复
关注哦~

2,204

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 CGI
社区管理员
  • CGI社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧