При запуске нижеприведенного сценария появляется сообщение об ошибке «Преждевременный конец скриптовых заголовков: contactform.cgi». Меня расстраивает то, что я запускал это как .php на другом сервере, и это сработало. Однако мне пришлось менять серверы, и они поддерживают только CGI PHP. Однако это не работает. Я не думаю, что код неправильный, но посмотрите на всякий случай.
Я читал, и некоторые говорили, что это вопрос с разрешениями. Может ли это иметь место для меня?
Я знаю, что операторы display_errors и "error_reporting" будут отображать ошибки в журнале ошибок, но если у меня нет доступа к серверу, как я могу проверить журналы?
#!/usr/local/bin/php <?php print "Content-type: text/html\n\n"; use CGI::Carp qw(fatalsToBrowser); ini_set('display_errors',1); error_reporting(E_ALL); if(isset($_POST['email'])) { //Email this form to me $email_to = "myemail@yahoo.com"; function died($error) { // your error code can go here echo "Oops... something's wrong. "; echo "Fix the error(s) below:<br /><br />"; echo $error."<br /><br />"; echo "All your base are belong to us...<br /><br />"; die(); } // validation expected data exists if(!isset($_POST['first_name']) || !isset($_POST['last_name']) || !isset($_POST['email']) || !isset($_POST['subject']) || !isset($_POST['comments'])) { died('There appears to be a problem with the form you submitted.'); } $first_name = $_POST['first_name']; // required $last_name = $_POST['last_name']; // required $email_from = $_POST['email']; // required $subject = $_POST['subject']; // not required $comments = $_POST['comments']; // required $error_message = ""; $email_exp = '/^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/'; if(!preg_match($email_exp,$email_from)) { $error_message .= 'The Email Address you entered does not appear to be valid.<br />'; } $string_exp = "/^[A-Za-z .'-]+$/"; if(!preg_match($string_exp,$first_name)) { $error_message .= 'The First Name you entered does not appear to be valid.<br />'; } if(!preg_match($string_exp,$last_name)) { $error_message .= 'The Last Name you entered does not appear to be valid.<br />'; } if(strlen($comments) < 2) { $error_message .= 'The Comments you entered do not appear to be valid.<br />'; } if(strlen($error_message) > 0) { died($error_message); } $email_message = "Form details below.\n\n"; function clean_string($string) { $bad = array("content-type","bcc:","to:","cc:","href"); return str_replace($bad,"",$string); } $email_message .= "First Name: ".clean_string($first_name)."\n"; $email_message .= "Last Name: ".clean_string($last_name)."\n"; $email_message .= "Email: ".clean_string($email_from)."\n"; $email_message .= "Subject: ".clean_string($subject)."\n"; $email_message .= "Comments: ".clean_string($comments)."\n"; //Email Subject (put here to include subject from form) $email_subject = "COR | ".clean_string($subject).""; // create email headers $headers = 'From: '.$email_from."\r\n". 'Reply-To: '.$email_from."\r\n" . 'X-Mailer: PHP/' . phpversion(); @mail($email_to, $email_subject, $email_message, $headers); ?> <!-- include your own success html here --> <?php header("Location: cor/thankyou.html"); } ?>
Я думал, что я отвечу на свой вопрос, чтобы пинать и хихикать (и для всех тех, кто однажды может оказаться с такой же ошибкой и ответами).
Это проблема с разрешением файла.
Все файлы на моем веб-сайте были настроены на разрешение «644». Как только я изменил уровень разрешений на 705 ( chmod 705
[ chmod 755
также будет работать]), все было в порядке и денди. Не то, чтобы это имело значение, но я также изменил папку, в которой он находился, до 701 (чтобы скрыть его, но все же быть исполняемым сервером).
Я все еще не понимаю, почему мой .PHP-файл работал на другом сервере, когда он, вероятно, был установлен на 644 ?? Как мог Apache выполнить скрипт без разрешения на мир? Не требует ли Apache разрешения на мир? Мне осталось всего несколько вопросов …
Сообщение об ошибке «Преждевременный конец заголовков сценариев», вероятно, является самым жалким и распространенным сообщением об ошибке, которое вы найдете. Фактически, на самом деле это означает, что сценарий остановлен по какой-либо причине, прежде чем он вернет какой-либо вывод на веб-сервер. Общей причиной этого для сценаристов является отказ установить тип содержимого перед печатью выходного кода. Например, в Perl перед печатью любого HTML необходимо указать скрипту Perl, чтобы установить тип содержимого text / html, это делается путем отправки заголовка, например:
print "Content-type: text/html\n\n";
Это касается разрешений файлов, и это происходит в системах, на которых установлены сервер suppp (обычно cpanel / whost).
Удаление разрешения на запись от кого-либо другого, кроме владельца (644 | 600) для файлов php, устранит проблему. Вот как я понял.
Надеюсь, это поможет.
Проверьте свои окончания линии! Если вы видите ошибку в файле, который не найден, за которым следует ошибка «преждевременных конечных заголовков» в вашем журнале Apache, возможно, у вас есть окончание строк Windows в вашем скрипте вместо стиля Unix. Я столкнулся с этой проблемой / решением.
Ошибка может быть вызвана различными проблемами. для получения дополнительной информации проверьте журналы suexec или fcgi. Например, если suexec имеет неправильный пользователь и permssion, это может вызвать ошибку для решения проблемы
chgrp WEBGROUP /usr/local/apache2/bin/suexec chmod 4750 /usr/local/apache2/bin/suexec
В моем случае мне пришлось изменить
#!/usr/bin/php
в
#!/usr/bin/php-cgi
u забыл добавить правильный заголовок типа контента в ответе, который должен иметь http-заголовок при размещении на apache2
использование
print "Content-type:text/html\r\n\r\n"
или
header('Content-Type: text/html');
Я пробовал все вышеперечисленное, но выяснил, что это отсутствующий компилятор Windows.
При загрузке и установке исправлена проблема. Чтобы убедиться, что это ваша проблема, попробуйте запустить PHP из командной строки.
msvcr110.dll отсутствует при ошибке компьютера при установке PHP
Чтобы исправить это, мне пришлось изменить разрешения для всего каталога на 755 (777 не сработало для меня) и изменили владельца файлов для всего каталога
chmod -R 755 public_html chown -R nobody:nobody public_html
никто не является пользователем, который запускает php на моем компьютере.
В моем случае (ссылаясь на файл PHP в верхней папке плагина WordPress) мне пришлось изменить разрешения для этой папки. Моя тестовая среда была прекрасной, но при развертывании в папке было 775. Я изменил ее на 755, и она отлично работает.
Сегодня я столкнулся с этой проблемой, но, к сожалению, ни одно из предложений здесь не помогло. Единственная проблема заключалась в том, что я не видел ЛЮБЫХ ошибок. Я буквально должен был сделать strace -p <process_id>
в потоке Apache, чтобы определить заголовки, написанные и сбой Apache на следующей строке; Где-то в моем PHP-коде я настраивал заголовок с более чем 12 КБ данных.
Урок здесь заключается в том, что в некоторых случаях Apache сбой с HTTP error 500 - Premature end of script
может быть результатом слишком длинных или переполняющих HTTP-заголовков.
Отлаживайте заголовки для длины, если у вас есть такие же проблемы, потому что большинство (если не все) веб-серверов имеют ограничения на HTTP-заголовки.
PS: В этом ответе есть информация о размерах заголовков.
У меня есть эта проблема и решить эту проблему, изменив PHP-версию с 5.3.3 до 5.6.30.
После многих diff это было то, чего не хватало в файле httpd.conf
на рассматриваемом сервере:
AddHandler php5-script .php
Решила проблему.