2016-10-27 35 views
-1

私は、特定のアドレス(ポート番号、10.xxx:portNumber)のWebサーバーとしてperlを使用しようとしていますが、デフォルトではindex.htmlファイルの内容も表示しています。しかし、ブラウザで10.x.x.x:portNumberを実行すると、perlはindex.htmlの内容を表示しません。 perlにファイルを読み込ませるには?perlをindex.htmlファイルから読み込む

これは私がこの問題を解決するためのコードです。

#!/usr/bin/perl 
{ 
package MyWebServer; 
use HTTP::Server::Simple::CGI; 
use base qw(HTTP::Server::Simple::CGI); 
my %dispatch = (
    '/' => \&resp_hello, 
); 


sub handle_request { 
    my $self = shift; 
    my $cgi = shift; 
    my $path = $cgi->path_info(); 
    my $handler = $dispatch{$path}; 
    if (ref($handler) eq "CODE") { 
     print "HTTP/1.0 200 OK\r\n"; 
     $handler->($cgi); 
    } else { 
     print "HTTP/1.0 404 Not found\r\n"; 
     print $cgi->header, 
     $cgi->start_html('Not found'), 
     $cgi->h1('Not found'), 
     $cgi->end_html; 
    } 
} 


sub resp_hello { 
    my $cgi = shift; # CGI.pm object 
    return if !ref $cgi; 
    my $who = $cgi->param('name'); 
    print $cgi->header, 
     $cgi->start_html("Hello"), 
     $cgi->h1("Hello Perl"), 
     $cgi->end_html; 
} 
} 


my $pid = MyWebServer->new(XXXX)->background(); 
print "Use 'kill $pid' to stop server.\n"; 

ありがとうございます。

+0

ブラウザからperlスクリプトをどのように呼び出していますか? –

答えて

0

サーバーのルートURLにアクセスすると、コードが明示的に構成されてresp_hello()に設定されています。

my %dispatch = (
    '/' => \&resp_hello, 
); 

は、私はあなたが実装することを望んでいるまさにURL構造を知りませんが、あなたは//index.htmlを区別しようとしているなら、あなたはこのような何か行うことができます:

my %dispatch = (
    '/' => \&resp_hello, 
    '/index.html' => \&resp_index, 
); 

、その後にindex.htmlファイルを開き、内容をブラウザに返すresp_index()サブルーチンを作成します。

これを拡張して、ファイルシステムに直接存在するファイルを直接提供することもできます。

しかし、私はなぜこれをすべて自分でやっているのだろうと、PSGI and Plackを使用するソリューションに到達するだけではないのだろうかと思います。 HTTP :: Server :: Simpleを使用するアイデアはどこにありましたか?

私はdocumentationを参照して、CGI.pmのHTML生成機能の使用を推奨します。私たちは皆、彼らがかなりの時間の間、どんな恐ろしいアイデアを知っていたのですか?they are now deprecated

この道を過ぎて過ごす前に、もっと標準的なPerl Webツールを調べてほしいと思います。

関連する問題