【问题标题】:Perl scripts on Apache not retrieving POST dataApache 上的 Perl 脚本不检索 POST 数据
【发布时间】:2019-06-12 11:56:21
【问题描述】:

我正在尝试在我的本地 MAMP apache2 服务器上运行预先存在的 PERL Web 应用程序,但在获取发布数据时遇到问题。该应用程序使用 cgi.pm 尝试从 $cgi->param 抓取数据,但即使以 x-www-form-urlencoded 格式发送格式正确的帖子数据,参数也始终为空。

此外,STDIN 始终为空,如果不以 \* 开头,则会引发错误。

hello-world-form.cgi:

#!/[localpath]/perl5/perlbrew/perls/perl-5.24.0/bin/perl -d

use strict;
use warnings;

print "Content-type: text/html\n\n";
print qq(
  <!doctype html>
  <html>
  <body>
    <form action=\"hello-world.cgi\" method=\"POST\">
      <input type=\"text\" name=\"myparam\" />
      <input type=\"submit\" value=\"submit post var\" />
    </form>
  </body>
  </html>
);

你好世界.cgi:

#!/[localpath]/perlbrew/perls/perl-5.24.0/bin/perl -d

use strict;
use warnings;
use CGI;

my $q = CGI->new();

print "Content-type: text/html\n\n";
print "<p>key = " . $q->param('myparam') . "</p>\n"; #this is always empty
my @names = $q->param;
foreach my $name (@names) {
  print "<p>$name = " . $q->param($name) . "</p>"; #this never runs
}

my $postdata = '';
my $in = \*STDIN;
my $bytes = read($in, $postdata, $ENV{'CONTENT_LENGTH'});
print "<p>postdata = $postdata</p>\n"; # postdata is empty
print "<p>content length = " . $ENV{'CONTENT_LENGTH'} . "</p>\n"; # this number seems correct

foreach my $key (keys %ENV) {
  print "<p>$key --> $ENV{$key}</p>\n"; # nothing special here
}

httpd.conf:

...
LoadModule cgi_module modules/mod_cgi.so
LoadModule perl_module modules/mod_perl.so
...
ScriptAlias /cgi-bin/ "/[siteroot]/cgi-bin/"
Alias /perl/ "/Applications/MAMP/cgi-bin/"
<IfModule perl_module>
    PerlModule ModPerl::Registry
    <Location /perl>
        SetHandler perl-script
        PerlResponseHandler ModPerl::Registry
        PerlOptions +ParseHeaders
        Options +ExecCGI
    </Location>
</IfModule>

我正在使用这些模块通过 perlbrew 运行 PERL v5.24.0:

> perlbrew list-modules

CGI
Date::Parse
Encode::Locale
HTML::Parser
HTML::Tagset
HTTP::Date
HTTP::Message
IO::HTML
LWP::MediaTypes
Perl
Sub::Uplevel
Test::Deep
Test::Needs
Test::NoWarnings
Test::Warn
Try::Tiny
URI

有什么想法吗?

【问题讨论】:

  • 请向我们展示您如何将 POST 请求发送到您的 Perl 程序。
  • 另外,为什么你在脚本的 hashbang 行有-d
  • (另外,*STDIN 上没有可用数据,因为CGI 已经读取了那里的所有可用数据。所以,请发布minimal reproducible example 以便我们可以复制它。这包括您用来提交 POST 请求的 HTML。
  • 如果您已经可以访问 POSTed 请求,我建议您也添加它,包括标头和正文等。如果人们可以自己检查实际发送的值,我不会受到伤害。
  • 太棒了! -d 是这里的问题,我会将其标记为答案。我为后代添加了表单提交代码(我使用邮递员进行测试,所以我之前没有示例表单文件)。感谢您对 STDIN 的解释。不幸的是,实际的 Perl 应用程序现在在没有 -d 的情况下中断,但至少我有一个新问题要解决。 :)

标签: apache perl cgi.pm


【解决方案1】:

从 shebang 中删除 -d 解决了这个问题。感谢 Corion 的回答。

【讨论】:

    猜你喜欢
    • 2020-04-03
    • 2019-07-17
    • 2013-12-16
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    相关资源
    最近更新 更多