2013-07-11 2 views
17

При запуске сценария ниже появляется сообщение об ошибке «Преждевременный конец скриптовых заголовков: contactform.cgi». Меня расстраивает то, что я запускал это как .php на другом сервере, и это сработало. Однако мне пришлось менять серверы, и они поддерживают только CGI PHP. Однако это не работает. Я не думаю, что код неправильный, но посмотрите на всякий случай.Ошибка 500: Недопустимый конец заголовков скриптов

Я читал, а некоторые сказали, что это вопрос с разрешениями. Может ли это иметь место для меня?

Я знаю, что операторы «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'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._%-][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 = "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"); 
} 
?> 
+0

Вы должны вручную выводить заголовки с помощью cgi? Попробуйте распечатать «Content-type: text/html \ r \ n \ r \ n»; – Musa

+0

- это оператор печати, который отличается от утверждения печати, которое я использую в строке 5 моего сценария? – Keven

+1

'использовать CGI :: Carp qw (fatalsToBrowser);' - это не тот Perl, а не PHP? – Barmar

ответ

31

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

Это был вопрос прав доступа к файлам.

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

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

+1

Я размышляю здесь, но возможно, что ваш хост (по крайней мере, в какой-то момент) использовал '' 'phpsuexec''', который работает как _you_. С помощью справки bluehost: ** «Используя phpsuexec, php работает под вашим собственным именем пользователя на сервере, что устраняет необходимость сделать файлы и папки доступными для всего мира. Вместо этого вы можете просто использовать 755 для папок (по умолчанию) и 644 для файлов" ** – SeldomNeedy

+0

Я использовал 711 для каталога и его содержимое успешно. – BuvinJ

+0

Это сработало для меня. Однако я должен убедиться, что изменение 755 было сделано только в «папках», а не в файлах (что произошло по ошибке btw ... с использованием Filezilla). –

6

Сообщение об ошибке «Преждевременный конец скриптовых заголовков», вероятно, является самым жалким и распространенным сообщением об ошибке, которое вы найдете. Фактически это означает, что сценарий остановлен по какой-либо причине, прежде чем он вернет какой-либо вывод на веб-сервер. Общей причиной этого для сценаристов является невозможность установить тип содержимого перед печатью выходного кода. В Perl, например, перед печатью любой HTML необходимо сказать, скрипт на Perl, чтобы установить тип содержимого в текст/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

+0

Я делаю это в строке 5 моего сценария. Должен ли я размещать это где-то еще? – Keven

+0

Да, прямо вверху, прямо под edwardmp

+0

Это первое утверждение под тегом php, так что похоже, что оно уже в правильном месте, правильно? – Keven

0

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

использование

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

или

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

Я пробовал все вышеперечисленное, но выяснил, что это был отсутствующий компилятор окон.

Загрузка и установка исправлена. Чтобы убедиться, что это ваша проблема, попробуйте запустить PHP из командной строки.

msvcr110.dll is missing from computer error while installing PHP

1

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

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

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

1

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

0

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

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

никто не пользователь, который работает PHP в моем компьютере ,

1

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

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

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

0

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

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

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

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

1

В моем случае я должен был изменить

#!/usr/bin/php 

в

#!/usr/bin/php-cgi 
0

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

0

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

AddHandler php5-script .php 

решаемые проблемы.

+0

Caveat: Это похоже на конфигурацию Apache в нише и, вероятно, также под Ubuntu. Я никогда не видел, чтобы эта директива использовалась или нужна. – Machavity

+0

Это была более ранняя версия apache (2.2.22)/php (5.3.8)/openssl, которая была скомпилирована из исходных tarballs на Red Hat Enterprise Linux Server версии 5.5 –

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