4

首先,这是我正在使用的代码(您需要 0.42 版的HTTP::Server::Simple才能运行它):

#!/usr/bin/perl
package My::HTTP::Server;

use strict; use warnings;
use parent 'HTTP::Server::Simple::CGI';

sub handle_request {
    my $server = shift;
    my ($cgi) = @_;

    print $cgi->header('text/plain'), $cgi->state, "\n";
}

package main;
use strict; use warnings;

my $server = My::HTTP::Server->new;

$server->cgi_class('CGI::Simple');
$server->cgi_init(sub {
    require CGI::Simple;
    CGI::Simple->import(qw(-nph));
});

$server->port(8888);
$server->run;

当我启动服务器并浏览到时http://localhost:8888/here/is/something?a=1,我得到了输出http://localhost:8888E:\Home\Src\Test\HTTP-Server-Simple\hts.pl/here/is/something?a=1。那是因为CGI::Simple查看$0是否$ENV{SCRIPT_NAME}为空或未定义。所以,我认为解决方案是写:

$server->cgi_init(sub {
    $ENV{SCRIPT_NAME} = '/';
    require CGI::Simple;
    CGI::Simple->import(qw(-nph));
});

现在,我得到的输出是http://localhost:8888//here/is/something?a=1. 注意额外的/.

可以吗,还是有更好的方法来解决这个问题?

我正在尝试编写一个可以部署为mod_perl注册表脚本或独立应用程序的应用程序。

4

1 回答 1

4

CGI::Simple用于获取脚本名称的代码是:

sub script_name    { $ENV{'SCRIPT_NAME'} || $0 || '' }

基于此,我看到了几个选择:

  • 设置$ENV{SCRIPT_NAME}$0为假值
  • 子类或猴子补丁 CGI::Simple to overridescript_name

与全球混在一起让我感到紧张。改变$0可能是无害的。大概。

妄想症意味着我会重写script_name以最小化我的更改的影响。

猴子补丁很简单,很诱人:

{ no warnings 'redefine'; sub CGI::Simple::script_name {''} }

但是一个合适的子类并不太难,而且它确实可以最大限度地减少影响(但是你的应用程序中可能有多个 CGI::Simple 对象吗?):

package CGI::Simple::NoScriptName;

use base 'CGI::Simple';

sub script_name {''};

1;
于 2010-02-26T16:14:32.993 回答