【问题标题】:perl cgi script can't post to site - works standalone but fails when running under apacheperl cgi 脚本无法发布到站点 - 独立工作但在 apache 下运行时失败
【发布时间】:2011-07-03 07:28:48
【问题描述】:

我编写了一个 Perl CGI 脚本,它使用 POST 从站点获取 html 页面,然后对 html 数据进行一些处理并打印输出 html 内容。

我的脚本网址:http://mysite.com/cgi-bin/p.pl

网站网址:http://site.com/interesting.asp

#!/usr/bin/perl
# p.pl
...

sub post_url {
    my( $url, $formref ) = @_;
    my $ua = new LWP::UserAgent(timeout => 300);
    my $response = $ua->post($url, $formref );

if( $response->is_success ){
    return $response->content;
} else {
    return undef;
}
}

my $url = 'url: http://site.com/interesting.asp';
my %param = ('eno' => '1234', 'submit' => 'Submit');
my $htmlcontent = post_url( $url, \%param );    # <--- Not working

... do some processing on $htmlcontent ...

... print out html page ...

脚本从命令行运行时运行良好,但从 Web 服务器运行时无法从站点获取 HTML 页面。是因为它试图从不同的域/IP 地址访问页面的脚本吗?有人可以提出解决方法吗?

【问题讨论】:

    标签: javascript jquery perl cgi


    【解决方案1】:

    这可能有很多原因。假设实际调用了 cgi 脚本(即,它安装在您的 Web 服务器的正确位置),我会确保 LWP 实际安装在您的服务器上。确实,在各种情况下我不得不手动安装它,YMMV。

    在脚本失败的地方输出一些诊断信息真的很有帮助...new LWP::UserAgent 成功了吗?如果有,帖子后面的$response-&gt;status_line 是什么?

    编辑:

    由于您的错误消息是“500 权限被拒绝”,很可能您的网络服务器已阻止所有传出连接。您应该检查您的提供商是否允许通过某些代理进行传出 http 连接并将其配置到 LWP::UserAgent。如果没有可用的代理,那么可能就没有办法出去了。但是,如果不知道您的托管服务提供商设置,我们将无法提供帮助;也许您可以向您的托管服务提供商寻求支持...

    【讨论】:

    • 啊! $response->status_line 读取:“500 无法连接到 site.com:80(连接:权限被拒绝)”
    • 您认为可能是什么问题?
    • @Girish:看起来connect 系统调用对网络服务器是禁止的。例如,SELinux 支持这样的设置。你可以试试use IO::Socket::INET; my $sock = IO::Socket::INET-&gt;new(PeerAddr=&gt;'www.perl.org', PeerPort =&gt; 'http(80)', Proto =&gt; 'tcp') or die "socket: $!";看看是不是真的。
    • 我收到“socket: Permission denied at ...”。所以,我猜网络服务器正在阻止脚本连接到除了它运行的站点之外的任何站点。
    【解决方案2】:

    您应该从 $url: 中删除“url:”

    my $url = 'http://site.com/interesting.asp';

    【讨论】:

      【解决方案3】:

      启用 SELINUX 的系统将不允许来自 Web 代理 (httpd) 的传出连接。

      在 CentOS 6.3 上,您可以使用此命令在 Perl 脚本中启用来自 Apache 的出站 Web 连接:

      # setsebool -P httpd_can_network_connect on
      

      此页面可以告诉您有关 SELinux 和 HTTPD 设置的更多信息: http://wiki.centos.org/TipsAndTricks/SelinuxBooleans

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-04
        • 2014-03-05
        • 2014-10-30
        • 2011-12-23
        • 2012-01-03
        • 2015-10-24
        • 2012-10-15
        • 2015-05-27
        相关资源
        最近更新 更多