4

まず、私が使用しているコードは次のとおりです (実行するにはHTTP::Server::Simpleのバージョン 0.42 が必要です):

#!/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。これは、 ifが空または未定義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 をオーバーライドするscript_name

グローバルをいじると緊張します。変更$0はおそらく無害です。おそらく。

script_nameパラノイアとは、変更の影響を最小限に抑えるためにオーバーライドすることを意味します。

Monkey へのパッチ適用はとても簡単で、魅力的です。

{ 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 に答える