web-dev-qa-db-fra.com

Erreur 500: Fin prématurée des en-têtes de script

Je reçois un message d'erreur "Fin prématurée des en-têtes de script: contactform.cgi" lors de l'exécution du script ci-dessous. Ce qui me frustre, c’est que j’ai exécuté cela en tant que .php sur un autre serveur et que cela a fonctionné. Cependant, j'ai dû changer de serveur et ils ne supportent que CGI PHP. Cependant, ça ne marche pas. Je ne pense pas que le code est faux, mais jetez un coup d'oeil juste au cas où.

J'ai lu et certains ont dit qu'il s'agissait d'un problème d'autorisations. Cela pourrait-il être le cas pour moi?

Je sais que les instructions "display_errors" et "error_reporting" afficheront des erreurs dans le journal des erreurs, mais si je n'ai pas accès au serveur, comment puis-je vérifier les journaux?

#!/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._%-]+@[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");
}
?>
18
Keven

Je pensais que je répondrais à ma propre question pour les coups de pied et les rires (et pour tous ceux qui pourraient se retrouver un jour avec la même erreur et sans réponses).

C'était un problème d'autorisation de fichier.

Tous les fichiers sur mon site Web ont été définis avec l'autorisation de «644». Une fois que j'ai changé le niveau d'autorisation à 705 (chmod 705 [chmod 755 fonctionnera également])) tout allait bien et dandy. Ce n’est pas important, mais j’ai également changé le dossier dans lequel il se trouvait en 701 (pour le cacher, mais toujours être exécutable par le serveur).

Je ne comprends toujours pas pourquoi mon fichier .PHP a fonctionné sur l’autre serveur alors qu’il était probablement réglé sur 644 ?? Comment Apache pourrait-il exécuter le script sans autorisation mondiale? Apache n'a-t-il pas besoin d'une autorisation mondiale? Juste quelques questions que j'ai encore ...

35
Keven

Le message d'erreur "Fin prématurée des en-têtes de script" est probablement le message d'erreur le plus dégoûté et le plus courant que vous trouverez . Ce que l'erreur signifie en réalité est que le script s'est arrêté pour une raison quelconque avant de renvoyer une sortie au serveur Web . Une cause fréquente de ceci pour les rédacteurs de script est la non-définition d'un type de contenu avant l'impression du code de sortie. En Perl, par exemple, avant d'imprimer du HTML, il est nécessaire d'indiquer au script Perl de définir le type de contenu sur text/html. Pour ce faire, vous devez envoyer un en-tête, comme suit:

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

(source; http://htmlfixit.com/cgi-tutes/tutorial_Common_Web_dev_error_messages_and_what_the_the__mean.php#premature

9
edwardmp

Cela concerne les autorisations de fichiers et cela se produit sur les systèmes sur lesquels le suphp (généralement cpanel/whost serveurs) est installé. 

Supprimer l'autorisation d'écriture de toute autre personne que le propriétaire (644 | 600) des fichiers php résoudra le problème. C'est comme ça que je l'ai fait réparer.

J'espère que ça aide.

2
George Donev

Vérifiez vos fins de lignes! Si vous voyez une erreur indiquant que le fichier n'a pas été trouvé, suivie de cette erreur "prématurée d'en-têtes de fin" dans votre journal Apache, il se peut que votre script comporte des fins de ligne Windows au lieu du style Unix. J'ai rencontré ce problème/solution.

1
BuvinJ

Une erreur peut être causée par divers problèmes. pour plus d’informations, consultez les journaux suexec ou fcgi . Par exemple, si suexec a un utilisateur et une permission incorrects, cela peut entraîner l’erreur

chgrp WEBGROUP /usr/local/Apache2/bin/suexec
chmod 4750 /usr/local/Apache2/bin/suexec
1
Nitigya Sharma

pour résoudre ce problème, je devais modifier les autorisations pour le répertoire entier en 755 (777 ne fonctionnait pas pour moi), et je changeais de propriétaire de fichier

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

personne n'est utilisateur qui exécute php sur mon ordinateur.

1
Adem

J'ai rencontré ce problème aujourd'hui, mais malheureusement, aucune des suggestions présentées ne m'a aidé. Le seul problème était que je ne voyais AUCUNE erreur .. J'ai littéralement dû faire un strace -p <process_id> sur le thread Apache pour repérer les en-têtes en cours d'écriture et Apache planter sur la ligne suivante; Quelque part dans mon code PHP, je définissais un en-tête contenant plus de 12 Ko de données.

La leçon à tirer est que dans certains cas, Apache qui tombe en panne avec un échec de HTTP error 500 - Premature end of script- peut être le résultat d'en-têtes HTTP trop longs ou débordants.

Déboguez la longueur de vos en-têtes si vous rencontrez le même problème car la plupart (sinon la totalité) des serveurs Web ont des limites d’en-tête HTTP.

PS: Cette réponse a quelques informations sur la taille des en-têtes.

1
Henry van Megen

Dans mon cas je devais changer

#!/usr/bin/php

à

#!/usr/bin/php-cgi
1
mejem

Après de nombreuses diff, voici ce qui manquait dans le fichier httpd.conf sur le serveur en question:

AddHandler php5-script .php

Résolu le problème.

0
Larry R. Irwin

Je me suis heurté à ce problème en utilisant PHP-FPM et Apache après avoir augmenté les valeurs par défaut d'Apache LimitRequestFieldSize et LimitRequestLine. 

La seule raison pour laquelle j'ai fait cela (Apache dit de ne pas déranger) est parce que Yii2 a des problèmes de pjax avec les requêtes POST. Pour résoudre ce problème, j'ai décidé d'augmenter ces limites et d'utiliser des en-têtes gigantesques GET. 

php-fpm a cependant corrigé l'erreur 500. 

0
glyph

u oublié d’ajouter un en-tête de type de contenu approprié dans la réponse, qui est un en-tête HTTP indispensable lors de l’hébergement sur Apache2

utilisation 

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

ou

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

Dans mon cas (référençant un fichier PHP dans le dossier principal d'un plugin Wordpress), je devais modifier les autorisations sur ce dossier. Mon environnement de test fonctionnait bien, mais lorsqu’il était déployé, le dossier en comportait 775. Je l’ai changé en 755 et cela fonctionne bien.

0
BryanT

J'ai essayé tout ce qui précède, mais j'ai découvert qu'il manquait un compilateur Windows.

Le téléchargement et l'installation corrigent le problème. Pour voir si cela est votre problème, essayez d’exécuter PHP à partir de la ligne de commande.

msvcr110.dll est absent d'une erreur informatique lors de l'installation de PHP

0
Bud

J'ai ce problème et je résous ce problème en modifiant la version de PHP de 5.3.3 à 5.6.30.

0
MMParvin