为什么Perl的LWP :: Simple附带的head命令仅在我在命令行上调用它时才起作用?

时间:2011-10-31 15:21:18

标签: perl cgi lwp

我有一个简单的perl子例程,在决定是否打印链接到它或我们本地托管的副本的脚本之前,检查google是否仍然托管jquery 1.6的副本。

这是我正在使用的代码的副本。

my $jquery_host = "http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js";
my $header = LWP::Simple::head($jquery_host);

if(defined $header) {
    return qq{<script type="text/javascript" src="$jquery_host"></script>};
}
else {
    return qq{<script type="text/javascript" src="$localPath"></script>};
}

当我在此命令行上运行此代码时,我在检索响应时没有问题,并且它正确地打印出链接到google的jquery副本的脚本标记。但是,当我实际从构建html页面的perl脚本调用它时,它每次都找不到任何内容并打印出链接到我们自己的副本的脚本标记。

什么权限或其他类型的障碍可能会暂停此连接?

感谢您的帮助。

注意:到目前为止,这只在我们的本地测试服务器上运行。命令行也在测试服务器上运行。

2 个答案:

答案 0 :(得分:1)

我可以确认您的代码是孤立的。尝试将头部的赋值包装到if语句中;实际上也是内联网址字符串。唯一可能弄乱你的是你的服务器脚本在使用某些代理或tcp包装器的机器上运行,这不会让你从google.com获取jQuery。我们无法真正帮助您解决这些非常具体的本地问题。

如果我只是猜测我会说你有多个Perl环境正在进行,并且你的命令行使用的是一个很好的版本,但是你的web服务器正在调用另一个版本,一个可能会以破坏你正在做的事情的方式加强,就像为use in AppEngine提议的那样。但我上面提出的建议是基于这个代码片段周围的代码可能会搞乱你正在使用的变量的想法。看来这kind of issue确实出现在io sockets in mod_perl的使用周围。

计划摘要:

$ perl -MLWP::Simple -e '
if(head("http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js")) {
    print qq{<script type="text/javascript"
      src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js">
    </script>};
} else {
    print qq{<script type="text/javascript" src="$localPath"></script>};
}'

输出:

<script type="text/javascript"
  src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js">
</script>

我也写这个,以便将一些$scriptPath分配给jQuery路径或$localPath,然后通过if语句我只使用now打印脚本标记一次确定$scriptPath。但也许这只是我。

答案 1 :(得分:1)

我不知道为什么你的代码无效,但你不应该使用它:只是因为你的服务器可以到达ajax.googleapis.com并不意味着用户的浏览器可以。

只需在客户端上使用JavaScript进行回退即可。以下是基于this answer的示例代码:

return <<"END";
<script type="text/javascript" src="$jquery_host"></script>
<script type="text/javascript">
if (typeof jQuery == 'undefined') document.write(
    '<'+'script type="text/javascript" src="$localPath"><'+'/script>'
);
</script>
END