环境: - Active Perl 5.16 - Windows 2003 Server - 带有 Windows 身份验证的 IIS 6
我试图在 Perl CGI 脚本中使用 Perl 模块“LWP::Simple”,它对服务器上的“管理员”运行良好(使用 Windows 身份验证,IIS/CGI 环境知道用户 Windows 用户名和我们中的一些人) (像我一样)是服务器上的管理员)。但是,对于我们所有其他的非管理员用户,他们得到的是“指定的 CGI 应用程序因未返回完整的 HTTP 标头集而行为不端”。我将其缩小到“使用 LWP::Simple”这一行;如果线路在,非管理员会收到错误;如果线路中断,任何人都不会出错。
由于这是一个“使用”行,在我看来,在 IIS 下调试错误是不可能的(没有像样的错误日志!),所以我分解了 LWP::Simple 模块(它只使用了很多 LWP::UserAgent 东西) 并创建了以下简单脚本来重现潜在错误:
#!perl
use strict;
use warnings;
use CGI::Pretty qw(:standard -any -no_xhtml -oldstyle_urls *center);
use CGI::Carp qw(fatalsToBrowser set_message);
use LWP::UserAgent;
print header;
my $ua = LWP::UserAgent->new; # we create a global UserAgent object
$ua->env_proxy;
print "<hr>\n";
my $response = $ua->get('http://search.cpan.org/');
if ($response->is_success) {
print $response->decoded_content; # or whatever
}
else {
die $response->status_line;
}
由于错误没有发生在“使用”行中,我们不会得到可怕的 missing-http-headers 错误,而真正的错误会出现在屏幕上:
Access is denied
这使我可以缩小到一行:
$ua->env_proxy;
如果该行在代码中,则非管理员的屏幕上会显示“访问被拒绝”字样(管理员不会收到任何错误)。在这两种情况下,脚本的其余部分都可以正常工作,但是这个错误会阻止 LWP::Simple 工作(错误发生在“使用”行中,并给出了 missing-http-headers 错误)。
虽然我的解决方法是不使用 LWP::Simple 而是使用 LWP::UserAgent(跳过“$ua->env_proxy”部分),但我真的很想知道为什么“$ua->env_proxy”给出“访问被拒绝“对于非管理员。
谁能帮我解决这个问题?