Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Нужна помощь по ошибке 500 (perl)


Автор: kocmocivan 16.9.2009, 17:04
Всем здравствуйте, очень нужна ваша помощь! 
ПРоблема в следующем. 
 
ПРи заходе в админку на сайте компании после ввода логина и паса или даже просто входе без ввода чего-либо идет ошибка: 
 
Internal Server Error 
The server encountered an internal error or misconfiguration and was unable to complete your request. 
 
Please contact the server administrator, [email protected] and inform them of the time the error occurred, and anything you might have done that may have caused the error. 
 
More information about this error may be available in the server error log. 
 
Apache/1.3.37 Server at www.decotec.ru Port 80 
 
Файл логов пишет следующее: 
## 
failed to open log file 
fopen: Permission denied 
[Wed Sep 16 17:08:20 2009] [error] [client 213.147.49.50] Premature end of script headers: /www/docs/wwwdecotec/cgi-bin/admin/login/index.pl 
failed to open log file 
fopen: Permission denied 
[Wed Sep 16 17:08:22 2009] [error] [client 213.147.49.50] Premature end of script headers: /www/docs/wwwdecotec/cgi-bin/admin/login/index.pl 
[Wed Sep 16 17:08:22 2009] [error] [client 213.147.49.50] File does not exist: /www/docs/wwwdecotec/www/favicon.ico 
[Wed Sep 16 17:08:27 2009] [error] [client 213.147.49.50] File does not exist: /www/docs/wwwdecotec/www/favicon.ico 
## 
 
Основной файл - index.pl который собственно и отвечает за вход в админку после ввода логина и паса. 
Его код - 
#!/usr/bin/perl 
use lib "../../lib"; 
use SysFunc; 
use Templates; 
use DBI; 
use data; 
 
my $globals=&SysFunc::get_globals(); 
%data=&data::get(); 
if(&SysFunc::login($data{login},$data{passwd})) 
{ 
    print qq~<script language=javascript>location.href="../cgi-bin/admin/index.pl";</script>~; 
} 
else 
{ 
    print "Content-type: text/html;charset=windows-1251\n\n"; 
    $data=Templates::add_translate($data,"error","<font color=red>оЕРТБЧЙМШОЩК МПЗЙО ЙМЙ РБТПМШ</font>"); 
    Templates::show_page("../../../admin.html",$data); 
} 
if($data{action} eq "logout") 
{ 
    &SysFunc::logout(); 
    print qq~<script language=javascript>location.href="/decotec/";</script>~; 
#    return 1; 
} 
&SysFunc::add_globals; 
exit(0); 
 
ПРоверил все что мог найти в инете по решению данной проблемы: 
1)код ,вроде, правильный (заголовки ответов правильные). 
2)права стоят 755 на файле и на папках. 
 
Еще прочитал что за данную ошибку так же отвечает .htaccess, вот его код: 
DirectoryIndex index.pl 
Options +ExecCGI  
RewriteEngine Off 
 
Есть еще одно соображение, может ли быть такое, что в данном файле идет бывшее сохранение с UTf-8 с BOM и из-за этого не работает. Т.к. раньше до меня код изменял мой ген. дир. с использованием WOrdPad я сейчас работаю с NotePad plus plus. Но он не находит никаких дополнительных кодеровок и доп прописей. 
 
print "Content-type: text/html;charset=windows-1251\n\n"; 
Заменял на print "Content-type: text/html;charset=windows-1251\r\n\r\n"; - тоже не помогает (как прочел где-то в инете)... 
 
Большая просьба еще помогающим, пишите "доступным языком" т.к. глубоких технических выражений я еще не знаю 

Автор: Bulat 16.9.2009, 17:37
Цитата(kocmocivan @  16.9.2009,  17:04 Найти цитируемый пост)
[Wed Sep 16 17:08:20 2009] [error] [client 213.147.49.50] Premature end of script headers: /www/docs/wwwdecotec/cgi-bin/admin/login/index.pl 


Что в большинстве случаев означает немножечко кривой код. smile прокомпилить скрипты и модули пробовал? Запустить в ручную?

Автор: kavkaz 16.9.2009, 17:38
переводы строк. особенно после 
Код
#!/usr/bin/perl


Автор: kocmocivan 16.9.2009, 19:26
переводы строк. особенно после  - Это что значит?

ПО поводу компеляции всего скрипта - я не знаю почти perl т.к. только начинаю, а сайт оказался как назло именно на perl и что там что обозначает я честно говоря не знаю...

Автор: kavkaz 17.9.2009, 11:54
from google:
Цитата

Скрипты, написанные на языке Perl, в операционных системах Unix должны иметь правильный перенос строки. В операционной системе Windows в конце каждой строки ставится символ переноса строки и символ возврата каретки. В системах Unix используется только символ переноса строки. В результате скрипты, написанные под системой Windows и закаченные по FTP не в ASCII режиме, не работают.
Самый простой способ решить данную проблему - это перезакачать все Perl-скрипты в ASCII режиме. В этом режиме FTP клиент автоматически заменит все Windows-окончания строка на Unix-окончания.

Если описанный выше способ не помогает, то можно убрать перенос строк выполнив следующую команду через SSH:

perl -i -npe 's/\r//' myscript.pl

где myscript.pl имя вашего скрипта.

Автор: kocmocivan 17.9.2009, 13:12
Самый простой способ решить данную проблему - это перезакачать все Perl-скрипты в ASCII режиме.  - СДЕЛАЛ не помогло!

Автор: kavkaz 17.9.2009, 16:33
К сожалению под рукой нет у меня компа с Windows ... там где то в настройках есть галочка, проявите любознательность smile

по поводу  ssh предлагаю погуглить... например это почитать http://ru.wikipedia.org/wiki/SSH

клиент для ssh под windows вам нужен PuTTY

данный для авторизации на ваш сервер с сайтом спрашивайте у администратора

Автор: sir_nuf_nuf 17.9.2009, 16:36
пишите больше знаков вопроса, мы не понимаем что вы спрашиваете!!!!!!!!!  smile 

Цитата(kocmocivan @  17.9.2009,  13:12 Найти цитируемый пост)
Как перезакачать все Perl-скрипты в ASCII режиме через Total Comandet

FTP + F5 ? если хостер разрешает FTP.

Цитата(kocmocivan @  17.9.2009,  13:12 Найти цитируемый пост)
и что такое SSH и с чем его едят

SSH  - защищенное соединение с удаленным сервером (unix)
Для вас это выглядит примерно так:
вы вводите пароль и получаете доступ к командной строке вашего сервера.
дальше делаете что хотите, точне на что хватит прав.

Автор: kocmocivan 17.9.2009, 16:40
Самый простой способ решить данную проблему - это перезакачать все Perl-скрипты в ASCII режиме.  - СДЕЛАЛ через CUteFTP не помогло!

Автор: sir_nuf_nuf 17.9.2009, 17:19
А еще меня смущает этот  момент:
Цитата(kocmocivan @  16.9.2009,  17:04 Найти цитируемый пост)
if(&SysFunc::login($data{login},$data{passwd})) 
{ 
    print qq~<script language=javascript>location.href="../cgi-bin/admin/index.pl";</script>~; 
} 

1) Если на страничке выводится javascript , то заголовки писать уже не надо что - ли ? Это ошибка
Заголовки должны быть всегда.
Код

print "Content-type: text/html;charset=windows-1251\n\n"; 


2) Это очень извращенный способ делать редирект.
Лучше так:
Код

print "Location: ../cgi-bin/admin/index.pl\n\n"; 


Автор: kocmocivan 17.9.2009, 19:06
sir_nuf_nuf 
ПО поводу загаловкой согласен - т.к. сама ошибка 500 идет именно из-за того что не заканчивается воспроизведение заголовка полностью... - это как я понял из разных источников.
НО ГДЕ ЭТО ОКОНЧАНИЕ НЕ ПРАВИЛЬНОЕ? или где прерывание начинается... после чегооо???

А вот по поводу - print "Content-type: text/html;charset=windows-1251\n\n"; 
Он должен писаться  именно так или хотя бы присутствовать в скрипте элемент - Content-type: text/html

Без него вывод заголовков и элементов ХТМЛ бесполезен и не работает, опять же как я понял...

Автор: sir_nuf_nuf 18.9.2009, 01:52
Во первых, дабы рассеить ваши сомнения:
perl у пофиг на переносы строк. Он нормально разбирает и виндовый вариант ("\r\n") и unix ("\n")
Ошибка НЕ в этом.

Цитата(kocmocivan @  17.9.2009,  19:06 Найти цитируемый пост)
где прерывание начинается... после чегооо???

у вас скрипт не большой - можно просто перебрать все варианты. Расставьте отладочную печать - поймете как скрипт работает.
Код

print STDERR "1\n";


Цитата(kocmocivan @  17.9.2009,  19:06 Найти цитируемый пост)
А вот по поводу - print "Content-type: text/html;charset=windows-1251\n\n"; 
Он должен писаться  именно так или хотя бы присутствовать в скрипте элемент - Content-type: text/html

Поймите, вы выводите не HTML, вы выводите ответ HTTP целиком (заголовки + контент)
По стандарту HTTP конент должен быть отделен от заголовков пустой строкой. поэтому "\n\n" - необходимо.

Автор: kocmocivan 18.9.2009, 09:40
Прогнал скрипт через  DzSoft Perl Editor -
он пишет следующее -  что ошибка при инициализации use SysFunc.pm ...

Автор: Bulat 18.9.2009, 10:04
kocmocivan, если есть доступ на сервер выполни команду

perl -c /www/docs/wwwdecotec/cgi-bin/admin/login/index.pl - компиляция smile

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

Добавлено через 2 минуты и 54 секунды
можно и на винде, через cmd... Пуск -> выполнить -> cmd(ОК)... ту же самую команду, только путь относительно того, где у тебя скрипт. smile

Автор: kocmocivan 18.9.2009, 10:26
perl -c /www/docs/wwwdecotec/cgi-bin/admin/login/index.pl
perl -c /cgi-bin/admin/login/index.pl
perl -c ../cgi-bin/admin/login/index.pl
COMMAND NOT UNDETSTOOD - короче не понимает он комунду... 
ВВел в Total COmandor

Автор: sir_nuf_nuf 18.9.2009, 10:56
в windows разделители каталогов - дргуие.

Пишите что то типа
Код

perl -c С:\ww\docs\wwwdecotec\cgi-bin\admin\login\index.pl

Автор: Bulat 18.9.2009, 15:48
Цитата(kocmocivan @  18.9.2009,  10:26 Найти цитируемый пост)
ВВел в Total COmandor 


Еще бы. smile Во-первых, для винды это не абсолютный путь.. Де факто совсем не обязательно всегда абсолютный, но это уже иное... Во вторых, есть такая вещь как командная строка - cmd... И никаких TC не нужно...

Если чего-то не понятно, не получается сделать именно так как я написал - спроси конретно.. Но если ты будешь делать то, что я пишу чуть по-своему - ес-но вряд ли это даст результаты. А компиляция - первое дело, если скрипт не отрабатывает. smile

P.S. если уж и работать со скриптовыми языками в винде, то хотя бы под FAR.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)