500 внутренняя ошибка сервера Perl CGI - PullRequest
0 голосов
/ 27 августа 2018

У меня проблема с моим Perl CGI.При выполнении сценария Perl я вижу ошибку:

Использование неинициализированного значения $ params в split в строке videoplayback.pl 4.

Итак, мы получаем ошибку:

Внутренняя ошибка сервера

Сервер обнаружил внутреннюю ошибку или неверную конфигурацию и не смог выполнить ваш запрос.

Пожалуйста, свяжитесь с администратором сервера по адресу [адрес не указан], чтобы сообщить им ово время возникновения этой ошибки и действий, которые вы выполнили непосредственно перед этой ошибкой.

Дополнительные сведения об этой ошибке могут быть доступны в журнале ошибок сервера.

Кроме того, обнаружена ошибка 404 Not Found.при попытке использовать ErrorDocument для обработки запроса.

Пожалуйста, исправьте.

Это мой код:

    #!/usr/bin/perl

$params= $ENV{'QUERY_STRING'};
@tokens=split('&', $params);

foreach $string (@tokens){ 

 @mess=split('=', $string);

 if(index($params, "audio")!=-1){
  if($mess[0] eq "range"){
   $range=$mess[1];
   $command="curl --header \"Range: bytes=${range}\" http://127.0.0.1/audio.mp4";

   print "HTTP/1.1 200 OK\r\n";
   print "Content-Length: ", length($command), "\r\n";
   print "Last-Modified: Fri, 28 Jun 2013 14:34:55 GMT\r\n";
   print "Content-Type: audio/mp4\r\n";
   print "Date: Wed, 17 Jul 2013 14:28:52 GMT\r\n";
   print "Expires: Wed, 17 Jul 2013 14:28:52 GMT\r\nCache-Control: private, max-age=22303\r\nAccept-Ranges: bytes\r\nAccess-Control-Allow-Origin: http://www.youtube.com\r\nAccess-Control-Allow-Credentials: true\r\nTiming-Allow-Origin: http://www.youtube.com\r\nConnection: keep-alive\r\nX-Content-Type-Options: nosniff\r\nServer: gvs 1.0\n\r\n";

   print `$command`;
  }
 }

 elsif(index($params, "video")!=-1){
  if($mess[0] eq "range"){
   print "Content-type: video/mp4\n\n";
   $range2=$mess[1];
   $command2="curl --header \"Range: bytes=${range2}\" http://127.0.0.1/planet_360.mp4";
   print `$command2`;
  }
 }
}

Спасибо.

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Ваша CGI-программа ожидает параметры запроса.Параметры запроса - это (необязательные) биты URL, которые появляются после ?.Поэтому в URL-адресе, который выглядит следующим образом:

https://example.com/cgi/your_program.cgi?foo=1&bar=2

Параметры запроса: foo=1&bar=2.

Внутри CGI-программы вы получаете доступ к параметрам запроса, анализируя их из $ENV{QUERY_STRING},Это то, что делают первые несколько строк вашей программы.

Но что происходит, если ваша программа вызывается так:

https://example.com/cgi/your_program.cgi

Тогда нет параметров запроса и в них ничего не будет$ENV{QUERY_STRING}.Вот что генерирует предупреждение (и это предупреждение, а не ошибка), которое вы видите.В строке 4 вы пытаетесь разделить $params, но в $params нет данных.Ваша программа должна иметь дело с тем случаем, когда ей передаются никакие параметры.

Но это не то, что убивает вашу программу.Как я уже сказал, это предупреждение, а не ошибка.Ошибка вызвана другой проблемой.

Программа CGI должна возвращать две вещи - набор заголовков и некоторый контент.Вы, очевидно, знаете, что большая часть вашего кода связана с печатью заголовков и контента.Но что происходит, когда нет параметров?Поскольку $params пусто, @tokens также не будет содержать данных.Это означает, что ваше тело цикла foreach никогда не выполняется и заголовок не возвращается.

Могу поспорить, что журнал ошибок вашего веб-сервера содержит что-то вроде «заголовки не найдены».

Еще несколько вещей, которые следует учитывать:

  • Всегда добавляйте use strict и use warnings к вашему Perl-коду.И исправьте обнаруженные проблемы (наиболее очевидной из них будет необходимость объявить все ваши переменные, используя my).
  • Пожалуйста, подумайте об использовании CGI.pm для анализа ваших параметров и создания ваших заголовков.В этом есть сложности, которые вы не учли.Люди, написавшие модуль, рассмотрели их.
  • Программа CGI должна излучать ровно один набор заголовков.Так что помещать заголовки в цикл, который может быть выполнен ноль раз (как мы делаем сейчас) или несколько раз, кажется странным.Возможно, вы захотите пересмотреть эту логику.
  • Получение ввода от пользователя (например, range) и передача его непосредственно команде операционной системы - это путь к катастрофе.Пожалуйста, убедитесь, что вы очистили ввод пользователя перед тем, как использовать его таким образом.
0 голосов
/ 27 августа 2018

Кажется, у вас нет ничего в переменной среды 'QUERY_STRING'.Если вам это не нужно, вы можете выполнить:

$params= $ENV{'QUERY_STRING'} ? $ENV{'QUERY_STRING'} : 'foo';

Это позволит избежать ошибки «Использование неинициализированного значения $ params ..».Вы также можете проверить это, выполнив

perl videoplayback.pl

в своей консоли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...