【问题标题】:CGI Commandline Args DisappearingCGI 命令行参数消失
【发布时间】:2014-09-22 20:55:31
【问题描述】:

我有一个调用另一个 cgi 脚本的 cgi 脚本。

main_script.cgi 脚本如下所示:

print qx/child_script.cgi arg1=foo arg2=bar/;

child_script.cgi 看起来像这样:

use CGI;
use Data::Dumper;
my $query = CGI->new;
warn Dumper($query);

如果我在 shell 中执行 ./main_script.cgi,我会得到:

$VAR1 = bless( {
             '.parameters' => [
                                'arg1',
                                'arg2'
                              ],
             'use_tempfile' => 1,
             '.charset' => 'ISO-8859-1',
             '.fieldnames' => {},
             'param' => {
                          'arg1' => [
                                        'foo'
                                    ],
                          'arg2' => [
                                        'bar'
                                    ]
                        },
             'escape' => 1
           }, 'CGI' );

但是如果我在浏览器中访问myhost.com/main_script.cgi,输出是:

$VAR1 = bless( {
             '.parameters' => [],
             'use_tempfile' => 1,
             '.charset' => 'ISO-8859-1',
             '.fieldnames' => {},
             'param' => {},
             'escape' => 1
           }, 'CGI' );

【问题讨论】:

  • @Miller,我可能不明白你的意思,但默认情况下,CGI 对象确实包含来自命令行的参数 - 请参见此处:perldoc.perl.org/CGI.html#DEBUGGING
  • CGI 从标准输入读取变量,这就是为什么如果您从命令行调用它而不是从浏览器调用它可以正常工作的原因。 Also see

标签: perl cgi


【解决方案1】:

您的辅助脚本从您的第一个脚本继承 %ENV。如果CGI 看到REQUEST_METHOD,它会忽略命令行参数,而是从QUERY_STRING 等加载内容。

要解决此问题,您必须首先本地化 %ENV 并删除 REQUEST_METHOD

以下证明了这一点:

part1.pl

#!perl
use strict;
use warnings;

use CGI;
use Data::Dump;

my $q = CGI->new;

print "Content-type: text/plain; charset=iso-8859-1\n\n";
dd $q;

# Localize the REQUEST_METHOD so that the secondary process doesn't see it.
my $text = do {
    local $ENV{REQUEST_METHOD};
    qx(perl part2.pl arg1=val1 arg2=val2);
};

print $text;

part2.pl

#!perl
use strict;
use warnings;

use CGI;
use Data::Dump;

my $q = CGI->new;

print "Content-type: text/plain; charset=iso-8859-1\n\n";
dd $q;

访问http://localhost/cgi-bin/part1.pl?a=1&b=2 会显示以下内容:

bless({
  ".charset"     => "ISO-8859-1",
  ".fieldnames"  => {},
  ".parameters"  => ["a", "b"],
  "escape"       => 1,
  "param"        => { a => [1], b => [2] },
  "use_tempfile" => 1,
}, "CGI")
Content-type: text/plain; charset=iso-8859-1

bless({
  ".charset"     => "ISO-8859-1",
  ".fieldnames"  => {},
  ".parameters"  => ["arg1", "arg2"],
  "escape"       => 1,
  "param"        => { arg1 => ["val1"], arg2 => ["val2"] },
  "use_tempfile" => 1,
}, "CGI")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 2016-03-25
    • 2013-10-22
    相关资源
    最近更新 更多