2012-05-21 1 views
1

Il y a un script d'authentification assez vieux php sur un de nos serveurs qui ressemble à ceci:mise en mémoire tampon de sortie de PHP et l'emplacement d'en-tête

ob_start(); 

$log = new Auth(); 
// returns true 
$checkSession = $log->checkLog(); 

if(!$checkSession){ 

    header("Location: ../index.php"); 
    exit(); 

    }else{ 

    include "content/".$_GET["content"].".php"; 

    } 

$content = ob_get_contents(); 
ob_end_clean(); 

include "../".WEBROOT_TEMPLATE_FILE; 

Il a toujours travaillé en douceur (les utilisateurs authentifiés ont pu accéder à la page, non authentifié les utilisateurs ont été redirigés vers la page d'accueil) ... jusqu'à aujourd'hui! Pour une raison totalement inconnue, lorsque les utilisateurs tentent d'accéder à l'une des pages du serveur à partir d'un lien généré par une base de données Access 2000, ils sont toujours redirigés vers index.php.

La chose étrange est que cela fonctionne bien lorsque vous collez l'URL directement dans le navigateur. L'URL est exactement la même, et la variable $ _SERVER est également la même dans les deux cas. J'ai même vérifié les en-têtes HTTP qui sont également identiques.

De plus, si je commente la redirection, il fonctionne:

if(!$checkSession){ 

    //header("Location: ../index.php"); 
    //exit(); 

    }else{ 
    // that part is executed 
    include "content/".$_GET["content"].".php"; 

    } 

Quelqu'un a eu le même problème, mais malheureusement n'a pas reçu de réponse valable: PHP if-statement ignored when header(Location: xxx) is inside

Toute idée?

Merci d'avance pour votre aide,

modifier: trouvé la solution

Pour une raison quelconque, le serveur apache n'a pas aimé la demande http qui a été générée par la base de données d'accès 2000 et publié un nouveau avec des en-têtes modifiés (en particulier le http accept) ... Malheureusement, la première requête n'a initialisé aucune session ... d'où la redirection vers index.php.

Ainsi, le (laid, mais travailler) solution est, pour moi:

if($_SERVER['HTTP_ACCEPT']!="*/*"){ 
// Do your stuff 
} 
+0

nous ne pouvons pas résoudre vos problèmes de codage, nous ne connaissons pas les implémentations. Activer le rapport d'erreurs/erreurs d'affichage et démarrer le débogage. Je ne vois pas d'autre moyen ... – MonkeyMonkey

Répondre

0

Essayez ceci:

header("Location: http://site.com/index.php"); 
+0

Cela n'a rien changé. Je ne vois pas comment cela pourrait être lié à mon problème mais merci quand même. – supag

0

Comme @MonkeyMonkey ont dit qu'il se rapporte très probablement au fait que les en-têtes/les cookies sont déjà envoyé et au moment où le script atteint l'authentification de la session et redirige il ne peut pas les renvoyer.

Ceci devrait donner un "Attention: les en-têtes déjà envoyés" si vous définissez votre error_reporting à E_ALL.

Maintenant à propos de sortie a commencé, ce serait assez difficile à localiser. Virtuellement tout fichier inclus avant l'ob_start pourrait avoir un espace/tab/newline à la fin (après la fin ?>).

0

Ajouter cette après ob_start():

if(!isset($_SESSION)) { 
     session_start(); 
} 

et après cela, vérifier une variable de $_SESSION[] si elle est définie et a une valeur:

if(!isset($_SESSION['username']) || $_SESSION['username'] == "") { 

    header("Location: ../index.php"); //redirect unauthorized users 
    exit(); 
} 
else { 
// your code 
} 

Note: code ci-dessus est juste un Par exemple, changez selon vos besoins avant de l'utiliser.

Questions connexes