Php redirecționarea locației antetului Php nu funcționează (Programare, Php)

John S a intrebat.

Nici o idee de ce nu funcționează. Aici este codul:

if ((isset($_POST['cancel'])) && ($_POST['cancel'] == 'cancel'))
{
    header('Location: page1.php');
    echo $_POST['cancel'];
}

În loc de redirecționarea paginii, această ieșire este cancel către pagina web. A sărit peste redirecționare. De ce? Cum pot remedia acest lucru? page1.php este o pagină reală situată în același folder ca și pagina curentă. Codul de mai sus este chiar primele linii din fișierul php. Nu există nimic înainte. Nimic. Nici măcar spații albe.

Comentarii

  • Nu dați niciun ecou după aceea; faceți un exit() pentru a încheia scriptul. (Nu ar trebui să ieșiți nimic după ce ați emis acest antet) –  > Por Pekka.
  • Asta pentru că ați trimis deja date către browser în acest context și, prin urmare, se va aplica headers have been sent. Porniți error_reporting pentru a obține acest răspuns în viitor. –  > Por Ohgodwhy.
  • @Pekka웃 folosind echo este în regulă, mă îndoiesc că nu este suficientă condiția –  > Por Mr. Alien.
  • Raportarea erorilor este activată. Nu există erori. Dacă scot declarația echo, atunci oricum continuă cu restul paginii. Am inclus instrucțiunea echo pentru a arăta că se execută instrucțiunea if. –  > Por John S.
  • @JohnS încercați acest lucru header('Location: ABSOLUTE_URL_HERE', true, 302); –  > Por Domnul Alien.
14 răspunsuri
Mihai Stancu

Probabil că este o problemă generată de faptul că anteturile au fost deja trimise.

De ce

Acest lucru apare dacă ai trimis ceva cu ecou înainte de a decide să redirecționezi. Dacă este așa, atunci antetele inițiale (implicite) au fost trimise și noile antete nu pot înlocui ceva ce se află deja în bufferul de ieșire pregătindu-se să fie trimis către browser.

Uneori, nici măcar nu este necesar să fi făcut singur un ecou:

  • dacă o eroare este transmisă către browser, aceasta este considerată, de asemenea, conținut, astfel încât anteturile trebuie trimise înainte de informațiile privind eroarea;
  • în cazul în care unul dintre fișierele dumneavoastră este codificat într-un format (să spunem ISO-8859-1) și altul este codificat în alt format (să spunem UTF-8 cu BOM), incompatibilitatea dintre cele două codificări poate duce la ieșirea câtorva caractere;

Să verificăm

Pentru a testa dacă acesta este cazul, trebuie să activați raportarea erorilor: error_reporting(E_ALL); și să setați erorile care urmează să fie afișate ini_set('display_errors', TRUE); după care veți vedea probabil un avertisment care se referă la faptul că anteturile au fost deja trimise.

Să reparăm

Corectarea acestui tip de erori:

  • scriind logica de redirecționare undeva în cod, înainte ca ceva să fie emis;
  • folosind tampoane de ieșire pentru a capta orice informații de ieșire și a le elibera doar la un moment dat, când știți că toate încercările de redirecționare au fost executate;
  • folosind un cadru MVC adecvat, care rezolvă deja problema;

Mai multe

MVC îl rezolvă atât din punct de vedere funcțional, asigurându-se că logica se află în controler, iar controlerul declanșează afișarea/prezentarea unei vizualizări numai la sfârșitul controlorilor. Acest lucru înseamnă că puteți decide să faceți o redirecționare undeva în cadrul acțiunii, dar nu și în cadrul vizualizării.

Kiel Labuca

Am mai experimentat acest tip de problemă și acum nu mai folosesc header('Location: pageExample.php'); în schimb folosesc javascript’s document.location.

Schimbă-ți:

header('Location: page1.php');

În ceva de genul acesta:

echo "<script type='text/javascript'> document.location = 'page1.php'; </script>";

Și care este scopul echo $_POST['cancel']; ștergeți această linie dacă doriți doar redirecționarea. Eu am folosit acest <script> de fiecare dată și nu mă dezamăgește. 🙂

Padmanathan J

Utilizați @obstart sau încercați să utilizați Java Script

puneți-vă obstart(); în partea de sus a paginii dvs.

if ((isset($_POST['cancel'])) && ($_POST['cancel'] == 'cancel'))
{
    header('Location: page1.php');
    exit();
}

Dacă folosiți Javascript Utilizați window.location.href

window.location.href exemplu:

 if ((isset($_POST['cancel'])) && ($_POST['cancel'] == 'cancel'))
    {
        echo "<script type='text/javascript'>window.location.href = 'page1.php';</script>"
        exit();
    }

Comentarii

  • O redirecționare cu antet va trimite doar anteturile HTTP care specifică noul URL la care ați fost redirecționat. Folosirea JS este o soluție de avarie — înseamnă că trebuie să primiți/prelucrați/executați o pagină (anteturi HTTP + un anumit conținut) și apoi JavaScript va declanșa o nouă cerere pentru care să primiți/prelucrați/executați o altă pagină. –  > Por Mihai Stancu.
IRSHAD

Am avut și eu o problemă asemănătoare la godaddy hosting. dar după ce am pus ob_start(); la începutul paginii php de unde se redirecționa pagina, a funcționat bine.

Vă rog să găsiți exemplul de remediere:

fileName:index.php

<?php
ob_start();
...
header('Location: page1.php');
...
ob_end_flush();
?>

VishnuKumar Pv

Am avut o problemă similară… am rezolvat-o adăugând ob_start(); și ob_end_flush();

<?php 
ob_start();


require 'engine/vishnuHTML.class.php';
require 'engine/admin/login.class.php';

$html=new vishnuHTML();
 (!isset($_SESSION))?session_start():"";

/* blah bla Code
...........
...........
 */

</div>
</div>
<?php
}



ob_end_flush();
?>

Gândește-te la ob_start() ca și cum ar spune „Începeți să vă amintiți tot ceea ce ar fi ieșit în mod normal, dar nu faceți încă nimic cu el”.

ob_end_clean() sau ob_flush(), care fie oprește salvarea lucrurilor și aruncă tot ce a fost salvat, fie oprește salvarea și scoate totul dintr-o dată, respectiv.

Hariharaselvam Balasubramanian

Nici pentru mine nu a funcționat. Apoi am încercat cu javascript în interiorul php, cum ar fi

echo "<script type='text/javascript'>  window.location='index.php'; </script>";

Acest lucru va funcționa cu siguranță.

Comentarii

  • Uneori nu va funcționa, trebuie să puneți ob_start/end. vedeți postul meu, veți obține altceva. –  > Por IRSHAD.
Niketan Raval

Neer pentru a specifica codul de ieșire aici, astfel încât php să nu execute mai departe

if ((isset($_POST['cancel'])) && ($_POST['cancel'] == 'cancel'))
{
    header('Location: page1.php');        
    exit(0); // require to exit here 
}

John S

Pekka a răspuns la întrebarea mea în comentarii. El nu a postat un răspuns, așa că eu sunt acum. Utilizați exit() după redirecționarea antetului. Dintr-un motiv oarecare, restul codului paginii continuă să se execute după redirecționarea metodei header(). Când restul codului se execută, declarația echo este transmisă în pagină. Și nu puteți redirecționa folosind funcția header după ce ați ieșit în pagină. Pentru a evita ca restul codului să se execute, utilizați exit(). Mulțumesc, Pekka.

UPDATE: Când folosesc browserul web Internet Explorer, am observat că $_POST[‘cancel’] nu este de încredere. Nu știu exact de ce se întâmplă acest lucru, dar bănuiesc că IE afișează variabile suplimentare la trimiterea unui formular, mai exact este afișată variabila „cancel”. Am rezolvat acest lucru folosind un alt nume de variabilă decât ‘cancel’. Combinația dintre utilizarea exit() și un nume unic de variabilă funcționează pentru mine.

Raugaral

Încercați să adăugați

ob_start();

în partea de sus a codului, adică înainte de instrucțiunea include.

Comentarii

  • Trebuie să explicați de ce? –  > Por ʰᵈˑ ʰᵈˑ.
  • Adăugați ob_start(); în partea de sus a paginii dvs., ca după <php ob_start(); echo ‘html, head, etc’; ?> –  > Por Ajmal Praveen.
Abhi Burk

Asigurați-vă că nu lăsați un spațiu înainte de <?php atunci când începeți <?php în partea de sus a paginii.

anoraq

Fiți foarte atenți la spațiile albe și la alte lucruri care pot afecta „ieșirea” deja realizată. Știu cu siguranță acest lucru, dar tot am suferit de aceeași problemă. Întregul meu fișier „Admin.php” avea câteva spații după tag-ul de închidere php ?> în partea de jos pe ultimul rând 🙂

Ușor de descoperit prin adăugarea…

error_reporting(E_ALL);

…care mi-a spus care linie de cod a generat rezultatul.

Krish R

Încercați acest lucru, adăugați @ob_start() funcția în partea de sus a paginii,

if ((isset($_POST['cancel'])) && ($_POST['cancel'] == 'cancel'))
{
    header('Location: page1.php');
    exit();
}

Rob Puckett

Utilizați următorul cod:

if(isset($_SERVER['HTTPS']) == 'on')
{

    $self = $_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
    ?>

     <script type='text/javascript'>
     window.location.href = 'http://<?php echo $self ?>';
     </script>"
     <?php

     exit();
}
?>

Damianos17

puneți tag-ul < ?php în partea de sus a fișierului dvs. (începând de la prima linie a documentului)

nu:

--- Blank space or something ---
<?php

dar:

<?php
..your code
header('Location: page1.php');
...

Comentarii

  • Glumești? Am copiat următoarele din postarea mea inițială: „Codul de mai sus este chiar primele linii ale fișierului php. Nimic înainte de el. Nimic. Nici măcar spații albe.” Se pare că nu am inclus tag-ul php de deschidere în codul meu de mai sus, dar credeți-mă că nu există niciun spațiu alb înainte de tag-ul php de deschidere. Funcția exit după redirecționare a rezolvat acest lucru. Nu cred că redirecționarea ar funcționa dacă ar fi existat vreo ieșire, cu sau fără funcția exit. –  > Por John S.
  • în site-ul meu exit() nu a funcționat, dar a funcționat și aceasta: „<?php „ob_start(); …” la început și „…ob_end_flush(); ?>” la sfârșitul documentului. –  > Por Damianos17.

Tags: