2016-10-31 10 views
0

Как видно из моего кода ниже, я использую apache для обслуживания моего веб-сервера Perl. Мне нужно, чтобы Perl имел несколько вариантов маршрута для моего клиента, как показано в my %dispatch. Если я подумаю, что все будет очень похоже. Если мы посмотрим на мою подпрограмму sub resp_index, как я могу ее изменить, чтобы ссылаться на мой файл index.html, расположенный в моем корне: /var/www/perl?Веб-сервер Perl: Как проложить маршрут

/var/www/perl/perlServer.pl:

#!/usr/bin/perl 

{ 
    package MyWebServer; 

    use HTTP::Server::Simple::CGI; 

    use base qw(HTTP::Server::Simple::CGI); 

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

    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_index { 
     my $cgi = shift; # CGI.pm object 
     return if !ref $cgi; 

     my $who = $cgi->param('name'); 

     print $cgi->header, 
      $cgi->start_html("index"), 
      $cgi-h1("THIS IS INDEX"), 
      $cgi->end_html; 
    } 
} 

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

Если это упражнение, а не написание собственного веб-сервера, рассмотрите небольшую структуру маршрутизации, такую ​​как [Dancer] (http://perldancer.org/). Кроме того, что со всеми '' \ ''? Наконец, я не уверен, что вы спрашиваете. Кажется, вы спрашиваете, как читать файл? – Schwern

+0

Совет: 'print 'HTTP/1.0 200 OK \ r \ n"; print $ cgi-> header; 'должен быть' print $ cgi-> header ('text/html', '200 OK'); 'или, еще лучше,' print $ cgi-> header; ' – ikegami

+0

Совет:' print "HTTP/1.0 404 Не найден \ r \ n"; print $ cgi-> header; 'должен быть' print $ cgi-> header ('text/html', '404 Not found'); ' – ikegami

ответ

5

Я думаю, что вы спрашиваете, то, как вы служите файл с вашего веб-сервера? Откройте его и распечатайте, как и любой другой файл.

use autodie; 

sub resp_index { 
    my $cgi = shift; 
    return if !ref $cgi; 

    print $cgi->header; 

    open my $fh, "<", "/var/www/perl/index.html"; 
    print <$fh>; 
} 

Если только это упражнение, действительно, действительно, действительно не написать свой собственный веб-фреймворк. Это будет медленным, багги и небезопасным. Рассмотрим небольшую структуру маршрутизации, такую ​​как Dancer.

Например, смежные документы, такие как index.html и исполняемый код, например perlServer.pl, в этом же каталоге приглашают отверстие для безопасности. Исполняемый код должен быть изолирован в своем собственном каталоге, чтобы им могли быть предоставлены совершенно разные разрешения и более сильная защита.


Давайте поговорим об этой линии ...

return if !ref $cgi; 

Эта линия скрывает ошибку. Если ваши функции переданы с неправильным аргументом или без аргументов, он будет молча возвращаться, и вы (или человек, использующий это) не поймут, почему ничего не произошло. Это должно быть ошибка ...

use Carp; 
croak "resp_index() was not given a CGI object" if !ref $cgi; 

... но на самом деле вы должны использовать одну из существующих функций подписи модулей, таких как Method::Signatures.

 Смежные вопросы

  • Нет связанных вопросов^_^