Ошибка 500: недопустимый конец заголовков script

Я получаю сообщение об ошибке "Преждевременный конец заголовка сценария: 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 = "[email protected]";

function died($error) {
    // your error code can go here
    echo "Oops... something wrong. ";
    echo "Fix the error(s) below:<br /><br />";
    echo $error."<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._%-][email protected][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 = "SUBJECT | ".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: thankyou.html");
}
?>

Ответы

Ответ 1

Я думал, что я отвечу на свой вопрос для пинков и хихиканья (и для всех тех, кто однажды может оказаться с такой же ошибкой и ответами).

Это проблема с разрешением файла.

Все файлы на моем веб-сайте были настроены на разрешение "644". Как только я изменил уровень разрешений на 705 (chmod 705 [chmod 755 также будет работать]), все было в порядке и денди. Не то чтобы это имеет значение, но я также изменил папку, в которой он находился, до 701 (чтобы скрыть его, но все равно быть выполнимым сервером).

Я до сих пор не понимаю, почему мой .PHP файл работал на другом сервере, когда он, вероятно, был установлен на 644?? Как Apache выполнил script без разрешения на мир? Не требует ли Apache разрешения на мир? Всего несколько вопросов, которые у меня есть...

Ответ 2

Сообщение об ошибке "Преждевременный конец сообщения script", вероятно, является самым жалким и распространенным сообщением об ошибке, которое вы найдете. Фактически это означает, что script остановлен по какой-либо причине, прежде чем он вернет какой-либо вывод на веб-сервер. Общей причиной этого для авторов script является невозможность установить тип содержимого перед печатью выходного кода. Например, в Perl перед печатью любого HTML необходимо указать Perl script, чтобы установить тип содержимого в text/html, это делается путем отправки заголовка, например:

print "Content-type: text/html\n\n";

(источник; http://htmlfixit.com/cgi-tutes/tutorial_Common_Web_dev_error_messages_and_what_they_mean.php#premature

Ответ 3

Это связано с правами доступа к файлам, и это происходит в системах, на которых установлены сервер suppp (обычно cpanel/whost).

Удаление разрешения на запись от кого-либо другого, кроме владельца (644 | 600) для файлов php, устранит проблему. Вот как я исправился.

Надеюсь, это поможет.

Ответ 4

Проверьте окончание строки! Если вы видите ошибку в файле, который не найден, за которым следует ошибка "преждевременных конечных заголовков" в вашем журнале Apache - возможно, у вас есть окончания строк Windows в script вместо стиля Unix. Я столкнулся с этой проблемой/решением.

Ответ 5

чтобы исправить это, мне пришлось изменить разрешения для всего каталога на 755 (777 не работало для меня) и изменили владельца файлов для всего каталога

chmod -R 755 public_html
chown -R nobody:nobody public_html

никто не является пользователем, который запускает php на моем компьютере.

Ответ 6

Ошибка может быть вызвана различными проблемами. для получения дополнительной информации проверьте журналы suexec или fcgi. Например, если suexec имеет неправильный пользователь и permssion, это может привести к возникновению ошибки решить проблему

chgrp WEBGROUP /usr/local/apache2/bin/suexec
chmod 4750 /usr/local/apache2/bin/suexec

Ответ 7

Сегодня я столкнулся с этой проблемой, но, к сожалению, ни одно из предложений здесь не помогло. Единственная проблема заключалась в том, что я не видел ЛЮБЫХ ошибок. Я буквально должен был сделать strace -p <process_id> в потоке Apache, чтобы определить заголовки, написанные и сбой Apache на следующей строке; Где-то в моем PHP-коде я настраивал заголовок с более чем 12 КБ данных.

Урок состоит в том, что в некоторых случаях сбой Apache с HTTP error 500 - Premature end of script -failure может быть результатом слишком длинных или переполняющих HTTP-заголовков.

Отлаживайте заголовки для длины, если у вас есть такие же проблемы, потому что большинство (если не все) веб-серверов имеют ограничения на HTTP-заголовки.

PS: Этот ответ содержит информацию о размерах заголовков.

Ответ 8

В моем случае мне пришлось изменить

#!/usr/bin/php

к

#!/usr/bin/php-cgi

Ответ 9

В моем случае это был каталог кешей, который был не так велик, всего 17 МБ, но для структуры файла потребовался вечный доступ к веб-сайту, и он выдавал эту ошибку после достижения max_execution_time.

Я переименовал каталог в cache-BK и создал новый каталог кеша с теми же разрешениями, и это решило проблему.

Ответ 10

u забыл добавить правильный заголовок типа контента в ответе, который должен иметь заголовок http при размещении на apache2

использовать

print "Content-type:text/html\r\n\r\n"

или

header('Content-Type: text/html');

Ответ 12

В моем случае (ссылаясь на файл PHP в верхней папке плагина Wordpress) мне пришлось изменить разрешения для этой папки. Моя тестовая среда была в порядке, но при развертывании в папке было 775. Я изменил ее на 755, и она отлично работает.

Ответ 13

У меня есть эта проблема и разрешаю это, изменяя версию PHP с 5.3.3 до 5.6.30.

Ответ 14

После многих diff это было то, чего не было в файле httpd.conf на рассматриваемом сервере:

AddHandler php5-script .php

Решил проблему.

Ответ 15

Я столкнулся с этой проблемой, используя PHP-FPM и Apache после увеличения значений LimitRequestFieldSize и LimitRequestLine по умолчанию в Apache.

Единственная причина, по которой я это сделал (apache говорит "не связывайтесь"), заключается в том, что в Yii2 есть некоторые проблемы с pjax с запросами POST. В качестве обходного пути я решил увеличить эти ограничения и использовать гигантские заголовки GET.

php-fpm сгладил ошибку 500, хотя.

Ответ 16

Позднее в этой теме, но я периодически получаю эту ошибку на странице, которая прекрасно загружается в 99% случаев. Кроме того, если я обновлю браузер после получения ошибки, страница загрузится правильно. Ввиду этого, я не думаю, что это проблема с разрешениями, но я понятия не имею, что еще нужно искать, и мой веб-хостинг не очень полезен.