PDA

View Full Version : [PHP] Ridirezione: forse lo sbaglio, help!!


Matrixbob
17-06-2005, 18:53
[EDIT for update]
[1] REDIRECT SFRUTTANDO I META
Va inserito all'interno dei tag <head> e </head>

<META HTTP-EQUIV=REFRESH CONTENT="5; URL=http://www.MioSito.it">


[2] REDIRECT CON JAVASCRIPT
Va inserito all'interno dei tag <head> e </head>

<SCRIPT LANGUAGE="Javascript">
<!--
window.location="http://www.MioSito.it"
//-->
</SCRIPT>


[3] REDIRECT CON LINGUAGGIO ASP
Usare sempre l'istruzione <%response.buffer=true%> per evitare di incorrere in errori di interpretazione lato server.

<%response.buffer=true%>
<%
response.redirect "http://www.MioSito.it"
%>


[4] REDIRECT CON PERL

<% @LANGUAGE="Perlscript" %>
<%
$url="http://www.MioSito.it";
$Response->Redirect("$url");
%>


[5] REDIRECT CON PHP

<?php
$url = "http://www.MioSito.it";
if ($url) {
header("Location: $url");
} else if($QUERY_STRING) {
header("Location: ".urldecode($QUERY_STRING));
} else {
echo "Attenzione, l'URL è sbagliato";
}
?>


[6] REDIRECT CON PYTHON
usando mod_python (modulo di Apache)

from mod_python import util

def FunzioneRichiamata(req):

util.redirect(req, 'http:/www.nuova.url')


---- O L D P O S T ----

Io uso questo codice:

//ridirezione
if($numero == 1) header('Location: http://localhost/sysconf/mioaccount.php');

e ottengo questo errore:

Warning: Cannot modify header information - headers already sent by (output started at D:\www\sysconf\top.php:10) in D:\www\sysconf\login.php on line 21

Matrixbob
17-06-2005, 18:54
Come faccio, quando ho ad esempio completato il controllo di un login o la registrazione di un utente a reindirizzarlo ad un'altra pagina, chessò ad esempio ad 1 catalogo.php ?!?! :confused: :mbe:

Argosoft
17-06-2005, 19:07
Come faccio, quando ho ad esempio completato il controllo di un login o la registrazione di un utente a reindirizzarlo ad un'altra pagina, chessò ad esempio ad 1 catalogo.php ?!?! :confused: :mbe:

puoi fare come qui sul forum, mostrando una paginina intermedia che dice "sei stato riconosciuto" etc e poi inserire un link a catalogo.php (o per eleganza anche uno script javascript che fa il redirect.. tipo questo:


<script language="javascript">
function Redirect(){
location.href = "catalogo.php";
}

setTimeout("Redirect()",3000);
</script>

)

sta funzione header() non la conoscevo, interessante! o_O forse ti dà quell'errore perché la chiami dopo la sezione <head> della pagina... un po' come i cookies, che appena li metti un po' più in giù non funziona più un ca##o :p

qui potresti trover un po' di help : http://it2.php.net/header

ciau!

Matrixbob
17-06-2005, 19:27
javascript?!!!!
io lo odio... :( lo sto facendo solo "server side" il sito (PHP/JSP).

Sto cercando di mantenere il sito W3C autenticato, quindi questo script nel codice non posso sbatterglielo, devo metterlo nel file.js che poi come richiamo però?!

Se non trovo altra alternativa uso questa, adesso provo questo ...

Matrixbob
17-06-2005, 19:31
e la pagina intermedia come la sbatto nello script?!

me lo fai con intermedia.php lo script?!

anonimizzato
17-06-2005, 19:56
Io uso questo codice:

//ridirezione
if($numero == 1) header('Location: http://localhost/sysconf/mioaccount.php');

e ottengo questo errore:

Warning: Cannot modify header information - headers already sent by (output started at D:\www\sysconf\top.php:10) in D:\www\sysconf\login.php on line 21


controlla che non vi sia niente tipo spazi o altro codice che viene inviato al browser prima della funzione di redirect di PHP, è una cosa molto comune incappare in questo errore.

Argosoft
17-06-2005, 20:05
e la pagina intermedia come la sbatto nello script?!

me lo fai con intermedia.php lo script?!

io di solito organizzo la mia pagina php così:


<html>
<head>
...qui richiamerai il tuo .js no?
</head>
<body>
<?
//si prende come flag di controllo la variabile 'mode'
if(!isset($_POST['mode']))
$mode = 'form';
else
$mode = $_POST['mode'];

switch($mode){
case 'form':
?>
<form name="frmLogin" action="login.php" method="post">
visualizza i textbox per il login...
<input name="mode" type="hidden" value="login">
</form>
<?
break;

case 'login':
$username = $_POST['...'];
$password = $_POST['...'];

//controlla se sono giusti..

if(!$giusti)
die('login errato');

//aggiorna la sessione

//tutto è andato bene quindi facciamolo entrare

?>
Login corretto! stai per entrare, <a href="catalogo.php">clicca qui</a> o attendi che il browser ti reindirizzi

<script language="javascript">
//richiami la funzione di redirect che sta nel js
</script>
<?
break;
}

?>
</body>
</html>

Argosoft
17-06-2005, 20:07
controlla che non vi sia niente tipo spazi o altro codice che viene inviato al browser prima della funzione di redirect di PHP, è una cosa molto comune incappare in questo errore.

yeah...

poi fammi sapere come funziona sta header() che mi interessa :p

ciauz!

Matrixbob
17-06-2005, 21:06
controlla che non vi sia niente tipo spazi o altro codice che viene inviato al browser prima della funzione di redirect di PHP, è una cosa molto comune incappare in questo errore.
Cmq qella è l'unica maniera di fare la redirect in PHP o c'è ne sono altre?!

Matrixbob
17-06-2005, 21:06
Grazie Argosoft, adesso vedo se riesco ad utilizzare il tuo codice.
Si ma non mi hai fatto vedere come permettere di vedere una pagina intermedia per qualche secondo.

EDIT: ... ah ho capito è questa parte:

Login corretto! stai per entrare, <a href="catalogo.php">clicca qui</a> o attendi che il browser ti reindirizzi

<script language="javascript">
//richiami la funzione di redirect che sta nel js
</script

Matrixbob
17-06-2005, 21:16
>> DOMANDONE <<

Invece di fargli fare:
header('Location: http://localhost/sysconf/mioaccount.php');

posso fargli stampare il nome del server così:
header('Location: http://$NOME_DEL_SERVER/sysconf/mioaccount.php');

in modo da renderlo indipendete dal server su cui si trova?!

beppegrillo
17-06-2005, 22:09
>> DOMANDONE <<

Invece di fargli fare:
header('Location: http://localhost/sysconf/mioaccount.php');

posso fargli stampare il nome del server così:
header('Location: http://$NOME_DEL_SERVER/sysconf/mioaccount.php');

in modo da renderlo indipendete dal server su cui si trova?!
Se usi gli apici '' php non ti traduce il valore della variabile, ovviamente non ci vuole molto a decomporre la stringa.
Per la domanda precedente:
Si è l'unico modo lato server x php.

Matrixbob
18-06-2005, 00:21
Se usi gli apici '' php non ti traduce il valore della variabile, ovviamente non ci vuole molto a decomporre la stringa.

Mmm non sei stato molto chiaro, stai dicendo che con i doppi apici "$VAR" rimane scritto il nome della variabile.
Se invece metto l'apice '$VAR' allora viene scritto il valore della variabile?!
Almeno così ho capito io.

Per la domanda precedente:
Si è l'unico modo lato server x php.

ok, peccato.

beppegrillo
18-06-2005, 02:39
Mmm non sei stato molto chiaro, stai dicendo che con i doppi apici "$VAR" rimane scritto il nome della variabile.
Se invece metto l'apice '$VAR' allora viene scritto il valore della variabile?!
Almeno così ho capito io.

Esattamente l'opposto :D

SteR9
18-06-2005, 09:21
puoi usare un meta così:

<meta http-equiv="Refresh" content="4;url=http://www.sito.com/url">

dove 4 è il numero di secondi dopo quanto fare il redirect.

ciao :)

Matrixbob
18-06-2005, 12:14
puoi usare un meta così:

<meta http-equiv="Refresh" content="4;url=http://www.sito.com/url">

dove 4 è il numero di secondi dopo quanto fare il redirect.

ciao :)
... e questo non da fastidio allo standard W3C, almeno mi sembra.

Matrixbob
18-06-2005, 12:22
Secondo voi quale resta la migliore:
1] lato server con header();
2] il javasript
3] o il meta

:confused: :rolleyes: :confused:

kk3z
18-06-2005, 15:25
Lo javascript (nel codice php lo sbatti dove vuoi, e non conta la validazione perchè tanto la pagina con lo script è subito sovrascritta dal redirect :P ) finchè il browser lo supporta (opera?), altrimenti l'header() + ob_start() e ob_end_flush(); e come ultima possibilità il meta
:)

Matrixbob
18-06-2005, 16:23
> l'header() + ob_start() e ob_end_flush();
Puoi spiegare cosa fanno i primi due accoppiati ed il terzo da solo?!
TNX!

CMQ io pensavo il meta primo, header() come secondo ed in fine il JS come terzo.

kk3z
18-06-2005, 17:25
> l'header() + ob_start() e ob_end_flush();
Puoi spiegare cosa fanno i primi due accoppiati ed il terzo da solo?!
TNX!

CMQ io pensavo il meta primo, header() come secondo ed in fine il JS come terzo.

ob_start() attiva il buffering di ciò che deve essere stampato, che non viene stampato fino a quando non si chiama ob_end_flush() (che stampa tutto quello che è stato "bufferato" dopo la chiamata di ob_start() ). Per esempio:

questo ti dà errore:
<?php echo "ciao"; header("Location: index.php"); ?>

questo no:
<?php ob_start(); echo "ciao"; header("Location: index.php"); ob_end_flush();

Matrixbob
20-06-2005, 15:58
... curioso, devo ancora capire bene ...

Matrixbob
20-06-2005, 23:03
Ho provato a mettere nel mio file JS questo:
function Redirect()
{
function Page(){ location.href = "..\catalogo.php";}
setTimeout("Page()",3000);
}e lo ho richiamto così:
if($numero == 1)
{
echo "Login corretto! stai per entrare, <a href=\"catalogo.php\">clicca qui</a> o attendi che il browser ti reindirizzi.";
echo "<script language=\"javascript\">";
echo "Redirect();";
echo "</script>";
}
Ma niente da fare:
errore nel visualizzare la pagina .... :(

Neppure così:
function Redirect()
{
function Page(){ location.href = "http://localhost/sysconf/catalogo.php"; }
setTimeout("Page()",3000);
}

Funziona invece perfettamente:
if($numero == 1) print("<meta http-equiv=\"Refresh\" content=\"4; url=http://localhost/sysconf/catalogo.php\">");

kk3z
21-06-2005, 09:50
Non puoi dichiarare una funzione dentro una funzione :O

echo "stai per essere reindirizzato, ocio!";
echo "<script type='text\javascript'>
function redirect()
{
location.href = \"..\catalogo.php\";
}
setTimeout(\"redirect()\",3000);
</script>"

così dovrebbe andare, puoi comporre lo script direttamente negli echo e non avrai problemi

tglman
21-06-2005, 15:33
Il tuo prebelma l'ho avuto anch'io, questo come a provato a spiegare kk3z dipende da una inpostazione del'interprete php che praticamente consente di inviare il responzo della pagina mentre la si elabora, facendo questo non si possono inserire header dopo aver inviato una qualsiasi informazione al client perchè gli header devono arrivare prima delle altre informazioni.

Pero comunque si può impostare l'interprete php a bufferizzare tutto il responzo, dando cosi la possibilità di inserire un header in qualsiasi punto della paggina, infatti bufferizzando tutto, il responzo inzieme agli eventuali header viene inviato solo alla fine dell'elaborazione dell'intera paggina.

Comunque anche con la prima impostazione è possibile attivare/disattivare la bufferizzazione con le due funzioni descritte da kk3z

Ps. per attivare la bufferizzazzione dell'interprete e sufficente cambiare la riga output_buffering = Off in output_buffering = On nel file php.ini.

UnLimiTs
21-06-2005, 16:49
Ciao matrix...
Come ho visto sopra... ti hanno già risposto al problema....

Per usare header... si deve far uso dei buffer....

l'istruzione header se vede qualche istruzione che lo precede... non funziona... PHP NON LO INTERPRETA....

Quando avvii una pagina php........ il servente php riceve gli input tante volte quante sono le istruzioni.......

L'istruzione header per funzionare deve essere utilizzato come primo input .....

Per questo si utilizzano i buffer.... che non fanno altro che salvare in memoria tutte le istruzioni... e mandano l'input una sola volta alla fine della pagina php....

Spero sia stato kiaro....
Se hai problemi posta... :) e ti farò avere notizie + dettagliate

Matrixbob
21-06-2005, 17:02
Grazie siete favolosi,
ho risolto usando la meta che mi aveva suggerito "SteR9".
Va bene anche così o da inconvenienti?!

Ho provato con header e le funzioni di buffering, però continuava a darmi errore.
Probabilmente ne facevo io un uso errato.
Magari ob_start(); andava come prima istruzione PHP ed io invece la usavo così:

<?php
comandi;
comandi;
comandi;
ob_start(); header("Location: index.php"); ob_end_flush();
?>

e non risolvevo una bella mazza! :)

... questo soprattutto perchè non sapevo tutta la storia.
CMQ adesso proverò, tanto x cultura.

Matrixbob
21-06-2005, 17:05
Non puoi dichiarare una funzione dentro una funzione :O
Cavoli hai ragione,
sono i basilari della programmazione.
1 cosa sono le dichiarazioni ed 1 altra i richiami, sarà che a forza di manipolare molti e strani linguaggi ormai penso che sia possibile fare di tutto ... :(

UnLimiTs
21-06-2005, 17:06
hehe ob_start va sempre come prima istruzione :)

Matrixbob
21-06-2005, 17:09
CMQ questo 3D non deve scomparire, chissà a quanti altri :bimbo: programmatori può semplificare la vita!!! :rolleyes:

... mi chiedevo :doh: "ma dove cavolo è che spedisco l'header che non lo vedo"! :mbe::wtf:

Presto mi sarei consumato come Smigol/Gollum con l'anello :nera:

Ma poi ci siente voi che :nonsifa: :friend:

Matrixbob
21-06-2005, 17:49
sta funzione header() non la conoscevo, interessante!
Per completezza:
http://php.mirrors.ilisys.com.au/manual/it/function.header.php

Matrixbob
29-07-2005, 12:19
W3C mi da errore con il reindirizzamento fatto dal META:

http://img147.imageshack.us/img147/4710/immagine8zy.gif

Il mio DOCTYPE è questo:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<title>IL MIO TITOLO</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<meta name="Keywords" content="conferenze, gestione conferenze" />
<meta name="Description" content="SYSCONF" />
<link rel="stylesheet" type="text/css" href="css/ws-style.css" />
<script language="javascript" type="text/javascript" src="js/ws.js"></script>
</head>

L'uso che ne faccio del META è questo:

print("<meta http-equiv=\"Refresh\" content=\"4; url=http://$HTTP_HOST/sysconf/catalogo.php\" />");

VegetaSSJ5
30-07-2005, 12:07
per non farti dare errore devi anche scrivere exit() dopo l'header() così:if (...) {
header("location: .... ");
exit();
}

Matrixbob
05-08-2005, 11:52
per non farti dare errore devi anche scrivere exit() dopo l'header() così:if (...) {
header("location: .... ");
exit();
}
EHM, cioè dopo che stampo la META scrivo l'exit del PHP?!
Proverò ...

VegetaSSJ5
05-08-2005, 12:31
EHM, cioè dopo che stampo la META scrivo l'exit del PHP?!
Proverò ...
scusa ho frainteso la domanda! pensavo che il tuo problema riguardasse la redirezione fatta con il php e non con il meta dell'html... :p

Matrixbob
05-10-2005, 11:32
Raccolta di modi stilata:

[1] REDIRECT SFRUTTANDO I META
Va inserito all'interno dei tag <head> e </head>

<META HTTP-EQUIV=REFRESH CONTENT="5; URL=http://www.MioSito.it">


[2] REDIRECT CON JAVASCRIPT
Va inserito all'interno dei tag <head> e </head>

<SCRIPT LANGUAGE="Javascript">
<!--
window.location="http://www.MioSito.it"
//-->
</SCRIPT>


[3] REDIRECT CON LINGUAGGIO ASP
Usare sempre l'istruzione <%response.buffer=true%> per evitare di incorrere in errori di interpretazione lato server.

<%response.buffer=true%>
<%
response.redirect "http://www.MioSito.it"
%>


[4] REDIRECT CON PERL

<% @LANGUAGE="Perlscript" %>
<%
$url="http://www.MioSito.it";
$Response->Redirect("$url");
%>


[5] REDIRECT CON PHP

<?php
$url = "http://www.MioSito.it";
if ($url) {
header("Location: $url");
} else if($QUERY_STRING) {
header("Location: ".urldecode($QUERY_STRING));
} else {
echo "Attenzione, l'URL è sbagliato";
}
?>

VegetaSSJ5
05-10-2005, 12:53
:ave:

cdimauro
06-10-2005, 15:59
Con Python usando mod_python (modulo di Apache):


from mod_python import util

def FunzioneRichiamata(req):

util.redirect(req, 'http:/www.nuova.url')

Matrixbob
30-09-2010, 11:02
Up!
Rimangono questi i 5 modi migliori per ridirigere?

Raccolta di modi stilata:

[1] REDIRECT SFRUTTANDO I META
Va inserito all'interno dei tag <head> e </head>

<META HTTP-EQUIV=REFRESH CONTENT="5; URL=http://www.MioSito.it">


[2] REDIRECT CON JAVASCRIPT
Va inserito all'interno dei tag <head> e </head>

<SCRIPT LANGUAGE="Javascript">
<!--
window.location="http://www.MioSito.it"
//-->
</SCRIPT>


[3] REDIRECT CON LINGUAGGIO ASP
Usare sempre l'istruzione <%response.buffer=true%> per evitare di incorrere in errori di interpretazione lato server.

<%response.buffer=true%>
<%
response.redirect "http://www.MioSito.it"
%>


[4] REDIRECT CON PERL

<% @LANGUAGE="Perlscript" %>
<%
$url="http://www.MioSito.it";
$Response->Redirect("$url");
%>


[5] REDIRECT CON PHP

<?php
$url = "http://www.MioSito.it";
if ($url) {
header("Location: $url");
} else if($QUERY_STRING) {
header("Location: ".urldecode($QUERY_STRING));
} else {
echo "Attenzione, l'URL è sbagliato";
}
?>


[6] REDIRECT CON PYTHON
usando mod_python (modulo di Apache)

from mod_python import util

def FunzioneRichiamata(req):

util.redirect(req, 'http:/www.nuova.url')

Matrixbob
13-10-2010, 13:57
up!

alemoppo
14-10-2010, 23:18
Ho letto frettolosamente questo 3d...

Premetto che "conosco" soltanto HTML, JS e PHP.

I redirect di questi tre "linguaggi" hanno ognuno dei lati negativi.. bisogna soltanto saper sfruttare il loro punto di forza ;-)

Redirect HTML:
Semplice, sempre funzionante, ma aimé non validato, come avete detto sopra...

Redirect JS:
Funzionante soltanto se si attiva javascript (non date per scontato che tutti cel'hanno attivo!)

Redirect PHP:
In questo 3d io ho capito (e anche altri) il problema: state modificando un parametro (location) dell'header dopo aver trasmesso la pagina:
Una pagina web è composta dall'header e dal corpo. Nell'header, son presenti i parametri POST e alcuni parametri (tra cui, il location). Nel corpo, viene trasmesso il sorgente HTML, CSS, javascript...
Il server, prima trasmette l'header, poi il corpo della pagina. Quindi, appena scrivete qualcosa (appartentente al corpo della pagina), non potete più modificre parametri dell'header, perché l'avete già trasmesso al client! (browser)...

Infatti, se provate a fare un redirect con header() in questo modo:

<?php
header('Location: google.it');
echo '<html>
<head>
<title>Pagina non mostrata</title>
</head>
<body>
Questa pagina non verrà mai mostrata, perché il suo header ha impostato che deve fare il redirect su google
</body>
</html>';
?>

Invece questo non funziona:


echo "<hml> <!-- Con questo, avete chiuso l'header e da qui in avanti non è possibile più modificarlo, perché è stato già trasmesso! -->
<head><title>titolo</title>
</head>
<body>
testoasfpjaspfdo
</body>
</html>";
header('Location: google.it'); //non può funzionare perché l'header è già stato chiuso!


nemmeno questa funziona:


echo 'a'; //chiude l'header
header('Location: google.com');


p.s: notare che header e head sono due cose completamente diverse ;)

Spero di essere stato utile...

Ciao!