Foros del Web » Programando para Internet » PHP »

Problema al redirigir

Estas en el tema de Problema al redirigir en el foro de PHP en Foros del Web. tengo esto: <html> <head> <title><? echo $dir2; ?></title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body> <? $url = explode("/",$PHP_SELF); $filename2 = $url[sizeof($url)-1]; $dir2 = $url[sizeof($url)-2]; // ...
  #1 (permalink)  
Antiguo 10/04/2003, 10:48
 
Fecha de Ingreso: enero-2002
Ubicación: Perez Zeledon Costa Rica
Mensajes: 1.006
Antigüedad: 15 años, 11 meses
Puntos: 11
Problema al redirigir

tengo esto:
<html>
<head>
<title><? echo $dir2; ?></title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<?
$url = explode("/",$PHP_SELF);
$filename2 = $url[sizeof($url)-1];
$dir2 = $url[sizeof($url)-2];

// echo "El dir2 es: ".$dir2."<BR>";
/**echo "<script>document.location.href='../my.php?w=".$dir2."'</script>";
**/
header("Location:'../my.php?w=".$dir2."'");
exit;


?>
</body>
</html>



y me da este error:
Warning: Cannot modify header information - headers already sent by (output started at /x.php:2) inx.php on line 10

Por ke?

NOTa:
Se que si quito todo el html funca, pero Necesito ese html y sobre todo decir en el head el nombre de $dir2.

Otra opcion de redirigir en este caso usando html arriba.?

Última edición por rashid; 10/04/2003 a las 10:55
  #2 (permalink)  
Antiguo 10/04/2003, 11:08
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Te lo expliqué ya en:

http://www.forosdelweb.com/showthrea...hreadid=124772
(última réplica de ese mensaje 2º parrafo) ..

Te lo repito aquí:
cuando se usa header() NOOOO se puede enviar nada de HTML antes al navegador .. Este concepto paso por que sépas como FUNCIONA PHP ..

PHP se ejecuta en el servidor PRIMERO .. osease, PHP coge tu código (el que pusistes como ejemplo) .. Interpreta el código PHP (lo q esté dentro de <? y ?> ..) Si hay HTML q mostrar (o javascrtip o lo q sea del lado del cliente) desde PHP (via echo "algo" ... o print() o cualquier función para tal fin) .. se "compone" el código HTML que corresponda .. Con todo eso ya "armado" se le entrega al "Cliente" (q es tu navegador) en estos casos para que ejecute su parte (el HTML/javascript/flash y todo lo q sea del "cliente")...

Si comprendes esto .. NO tiene sentido para PHP:

Código PHP:
<html>
<head>
<title><? echo $dir2?></title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<?
$url 
explode("/",$PHP_SELF); 
$filename2 $url[sizeof($url)-1]; 
$dir2 $url[sizeof($url)-2];

// echo "El dir2 es: ".$dir2."<BR>";
/**echo "<script>document.location.href='../my.php?w=".$dir2."'</script>"; 
**/
header("Location:'../my.php?w=".$dir2."'"); 
exit;


?>
</body>
</html>
Si ese script .. ese código .. va ha hacer ciertas operaciones en el SERVIDOR (en PHP) y segun sea va a "redireccionar" a otra página .. Para PHP .. LE DA IGUAL todo ese HTML q tiens ahí .. En el 99% de caso NI te das cuenta de eso .. Pero si usas funciones como session_start() .. set_cookie() o header() (entre otras) .. Veras ese mensaje de error de PHP que dice "Heyyyy, porqué me estas enviando HTML si yo voy a ejecutar solo PHP?" (jeje mas o menos eso es lo q significa) xD

Por lo tanto .. en ese ejemplo SOBRA todo HTML..

Código PHP:
<?
$url 
explode("/",$PHP_SELF); 
$filename2 $url[sizeof($url)-1]; 
$dir2 $url[sizeof($url)-2];

// echo "El dir2 es: ".$dir2."<BR>";
/**echo "<script>document.location.href='../my.php?w=".$dir2."'</script>"; 
**/
header("Location: ../my.php?w=$dir2'"); 
exit;
?>
Y cuidado con el "Location: .. " Al estar entre "comillas" (dobles) puedes meter tus variables sin problemas .. pues "PHP" lo va a "parsear" (va a interpretar que $dir2 ahí le tiene q dar su valor) .. Tambien es importante el espacio entre location: y el URI q pones ..

Ahora, imagina que vas hacer un "redireccionamiento" si alguna condicion no se cumple (típico si has validado unos datos y no son correcto direccionar a un formulario) si son correctos .. muestro el HTML que hay a continucación ..

Esto NO sería correcto
Código PHP:
<html>
<head>
</head>
<body>
<?
if (nosecumplealgo){
  
header("location: algunstio.php");
  exit;
}
?>
Si no se cumple lo otro .. sigo con HTML ...
</body>
</html>
No es correcto por lo dicho anteriormente .. antes de header() no puede existir nada de HTML .. ademas por ende debería quedar:

Código PHP:
<?
if (nosecumplealgo){
  
header("location: algunstio.php");
  exit;
}
?>

<html>
<head>
</head>
<body>
Si no se cumple lo otro .. sigo con HTML ... o mas PHP
<?
echo "esto está generado por PHP";
?>
</body>
</html>
Como veras .. el concepto es sencillo .. pero hay q saberlo si vas a trabajar con CUALQUIER lenguaje del lado del servidor .. Ya no solo PHP sino que esta "teoría" es válida para Perl, ASP, etc ...

En resumen ..
Piensa siempre que PHP hace un "cut-and-paste" de tu código HTML/javascritp/etc que estas componiendo a base de la lógica de tus programación PHP (condicionales, bucles .. etc).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #3 (permalink)  
Antiguo 10/04/2003, 11:20
 
Fecha de Ingreso: enero-2002
Ubicación: Perez Zeledon Costa Rica
Mensajes: 1.006
Antigüedad: 15 años, 11 meses
Puntos: 11
Cluster, gracias, pero ya sabia eso:
[QUOTE]NOTa:
Se que si quito todo el html funca, pero Necesito ese html y sobre todo decir en el head el nombre de $dir2.

Otra opcion de redirigir en este caso usando html arriba.?
QUOTE]

quiza lo leiste antes de que lo editara.

Pero la duda entonces es cómo logro que <title><? echo $dir2; ?></title>
tenga el nombre de $dir2.

con un echo "<title>.$dir2.</title>";

???

gracias.
  #4 (permalink)  
Antiguo 10/04/2003, 11:26
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Pero .. a ver ...

El código que pusistes tal cual lo pusistes originalmente es lo que ha de hacer el script que hace la redirección .. o hay más código que en algun momento hagas un echo "algo" ?

Si lees bien la explicación que te dí sobre como funciona PHP . .verias que hay dos soluciones a tu proeblema:

1) Sigues usando javascript para redireccionar . tal cual lo tienes ahí en esa línea comentado // .. Y te olvidas de toda la teoría que intenté explicarte.

2) Aplicas la teoría que te dí sobre PHP y reorganizas tu código HTML/PHP teniendo en cuenta que PHP SIEMPRE se ejecuta antes en el servidor y que "compone" tu página HTML segun tu programación ...

Bueno .. hay una 3º opción que no me gusta usar por "comodidad" o por desconocimento de como funciona PHP.. Se trata de isar las funciones de control del Buffer de salida de PHP: ob_start() y afines ..

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #5 (permalink)  
Antiguo 10/04/2003, 11:30
Avatar de Cain  
Fecha de Ingreso: enero-2002
Ubicación: Catalunya
Mensajes: 6.459
Antigüedad: 15 años, 11 meses
Puntos: 17
Si tanto te importa poner el HTML, olvídate de PHP y usa una redirección de Javascript o un meta refreseh.
__________________
M a l d i t o F r i k i
  #6 (permalink)  
Antiguo 10/04/2003, 11:56
 
Fecha de Ingreso: enero-2002
Ubicación: Perez Zeledon Costa Rica
Mensajes: 1.006
Antigüedad: 15 años, 11 meses
Puntos: 11
Ok cluster, gracias, no quiero usar Js por ke con heder location la redirección es mas transparente y no se ve en el browser que ha sido redirigido.

Entiendo lo que me dices, entonces debido a que necesito tener en el Title el nombre del fólder, cuál de estas dos opciones es correcta:
1) tiro primero la redirección asumiendo que el resto del codigo se ejecutará de modo que un buscador (google) podrá leer en el title cualquier cosa.
Código PHP:
<?
$url 
explode("/",$PHP_SELF); 
$filename2 $url[sizeof($url)-1]; 
$dir2 $url[sizeof($url)-2];
//w=$dir2;
//require("../my.php?w=".$dir2."");
header("Location:../my.php?w=$dir2"); 
?>
<html>
<head>
<title>"<? echo $dir2; ?></title>
</head>
<body>
</body>
</html>

2) construyo el html mediante echo:
Código PHP:
 <?
echo "<html>";
echo 
"<head>";
echo 
"<title>".$dir2."</title>";
echo 
"</head>";
echo 
"<body>";
$url explode("/",$PHP_SELF); 
$filename2 $url[sizeof($url)-1]; 
$dir2 $url[sizeof($url)-2];
//w=$dir2;
//require("../my.php?w=".$dir2."");

header("Location:../my.php?w=$dir2."); 
echo 
"</body>";
echo 
"</html>";
?>
nota, creo que esta segunda opcion no es viable por lo mismo del html antes del php, Pero respecto a la primera, no estoy seguro de que en caso de que google esté leyendo la pag, pueda leer el title.

Su opinión?

Gracias.
  #7 (permalink)  
Antiguo 10/04/2003, 12:26
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
rashid

No entendistes el concepto de como funciona PHP que intenté explicarte ...

El <title> NO LO VAS a ver en ningun momento .. Para que lo quieres? .. Insisto: ¿tienes mas código HTML dentro o eso lo llamas en un "include()" desde otras páginas?

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #8 (permalink)  
Antiguo 10/04/2003, 12:29
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Por cierto .. todo esto:

$url = explode("/",$PHP_SELF);
$filename2 = $url[sizeof($url)-1];
$dir2 = $url[sizeof($url)-2];

se resumen en:
Código PHP:
$dir2=basename($PHP_SELF); 
Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #9 (permalink)  
Antiguo 10/04/2003, 12:32
 
Fecha de Ingreso: enero-2002
Ubicación: Perez Zeledon Costa Rica
Mensajes: 1.006
Antigüedad: 15 años, 11 meses
Puntos: 11
No cluster, simplemente, esta es una pagina index, que redirige a otra que hace un select, pero para ayudarme con los buscadores, quiero meter etiquetas html para que google (que se hubica en index y lee las etiquetas <Title>) pueda leer el contenido de la pagina, de este modo puedo aumentar muucho el contenido de mi sitio.

mmm me explico?
  #10 (permalink)  
Antiguo 10/04/2003, 12:39
 
Fecha de Ingreso: enero-2002
Ubicación: Perez Zeledon Costa Rica
Mensajes: 1.006
Antigüedad: 15 años, 11 meses
Puntos: 11
Cita:
$url = explode("/",$PHP_SELF);
$filename2 = $url[sizeof($url)-1];
$dir2 = $url[sizeof($url)-2];

se resumen en:


PHP:--------------------------------------------------------------------------------
$dir2=basename($PHP_SELF);

--------------------------------------------------------------------------------
No cluster, esto:
$url = explode("/",$PHP_SELF);
$filename2 = $url[sizeof($url)-1];
$dir2 = $url[sizeof($url)-2];

me da el nombre del directorio.

esto:

$dir2=basename($PHP_SELF);


me da el nombre de la pagina.

Un saludo!
  #11 (permalink)  
Antiguo 10/04/2003, 12:44
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
? .. bueno .. tu veras .. si es así usa las funciones de control del buffer (que ya te las he mencionado .. )

Código PHP:
<? 
ob_start
();
?>

Tu código original tal cual lo tenías .. con el header y todo lo q quieras ..

<?
ob_end_flush
();
?>
Más info .. usa el manual de php y busca esas funciones ..

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #12 (permalink)  
Antiguo 10/04/2003, 12:48
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Sobre "basename" .. Ok, no ví bien q parámetros usabas .. en tal caso tienes:

dirname() y realpath()
http://www.php.net/manual/en/function.dirname.php

Chekealas.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #13 (permalink)  
Antiguo 10/04/2003, 13:07
 
Fecha de Ingreso: enero-2002
Ubicación: Perez Zeledon Costa Rica
Mensajes: 1.006
Antigüedad: 15 años, 11 meses
Puntos: 11
trate de usar el dirname pero no me funciono, me daba todos los dirs, de modo que use esta funcion.

Unas dudas mas,
1) el buffer se refiere a que el script no es enviado hasta que es procesado por completo?

2) y entonces esta va al principio de todo
<?
ob_start();
?>
esta va al final del todo, el html.
<?
ob_end_flush();
?>


???

3) Veo que dices:
? .. bueno .. tu veras ..

eso significa que no es bueno hacer esto?
lo hago por ke en algun lado leï que google lee estas etiquetas y es bueno poner el nombre de la pagina en forma dinámica.
Que opinas?

Gracias maestro!
  #14 (permalink)  
Antiguo 10/04/2003, 13:35
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Sobre el uso de ob_start() .. si, es así .. pero tambien te dí el link hacia el manual revisalo para mas explicaciones .....

El "bueno tu veras" .. viene de:

1) El uso del buffer se suele usar para cookies (para hacer set_cookie() donde quieras .. siendo está una función que se ha de usar sin HTML delante .. pero con ob_start() .. etc .. puedes "solventar" .. el reestructurar el código de la página HTML/PHP y poner dicha instrucción donde debe ser.

2) .. "En teroría" .. PHP va hacer:

* Se pide index.php (google por ejemplo sus "robots" entra a tu sitio y la pide para indexarla)
* PHP guarda en el caché tu HTML con tu tile .. hace el redireccionamiento y vuelve a guardar el HTML de la página destino hasta que encuentré un ob_end_flush() que libere el "buffer" y entrege la página al navegador .. (en este caso del ejemplo será al robot de google.)

Por ese razonamiento (me puedo equivocar pero segun todo lo que he leido al respecto sobre el buffer .. así funciona) .. La página que se le va a entregar al "robot" de google será la página destino a la que redireccionas .. Si, justo a esa que pones en tu header("location: estapagina.tal") ...Y NO la página que tiene tu "title" en tu index.php ...

Para que compuebes lo que digo .. ejecuta tu index.php y observa el código HTML generado .. fijate en las cabeceras .. Puede ser:
1) se duplican los <HTML> de tu index.php .. con el de la página que redirecionas ...(si los tiene)
2) solo ves el <HMTL> de la última página q redireccionas ..

(apuesto por la opción 2)

A "google" como buscardor .. lo que mas le "molesta" y lo que peor indexa son las páginas tipo index.php?seccion=1 .. donde se "requiere" al contenido bajo una misma página index.php con su titulo y demas cabeceras para los robots de buscadores ...

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #15 (permalink)  
Antiguo 10/04/2003, 14:36
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 5 meses
Puntos: 16
Hola,

rashid, te convendria leer las especificaciones del protocolo de comunicaciones HTTP (el de internet). Puedes encontrarlo en la pagina de www.w3c.org .

Te lo explicare basicamente. Existen unas cosas llamadas cabeceras que los navegadores no muestran PERO LAS LEEN. Normalmente las leen antes de mostrar nada en pantalla. Estas cabeceras van al comienzo de la respuesta que da el servidor web al navegador cuando este ultimo le solicita una pagina. En esta respuesta las cabeceras van antes del HTML. En el caso de la cabecera LOCATION el navegador recive la respuesta, analiza las cabeceras, ve que hay una LOCATION, y solicita a servidor web la pagina indicada por la cabecera LOCATION. Ni se molesta en examinar el codigo HTML.

Como las cabeceras tienen que ser mandadas antes del codigo HTML, en PHP hay que indicar los header() y demas antes de enviar cualquier salida.

En HTML se pueden indicar cabeceras HTTP dentro del <head> con los <meta http-equiv>, no se si funciona con LOCATION, pero si funciona con REFRESH. Con esto si se veria la pagina en el navegador, aunque no se si el googlebot seguira la redireccion.

Supongo que con el header("Location") el googlebot no examinara el HTML y seguira la redireccion.

Y no te preocupes por googlebot, no creo que indexe una pagina sin contenido como index.php.

Saludos.

PD: Por cierto, en el codigo de tu primer mensaje estas generando un HTML mal formado, porque pones el exit; antes de cerrar los tags HTML.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #16 (permalink)  
Antiguo 11/04/2003, 11:28
 
Fecha de Ingreso: enero-2002
Ubicación: Perez Zeledon Costa Rica
Mensajes: 1.006
Antigüedad: 15 años, 11 meses
Puntos: 11
MUY AGRADECIDO con su comentarios.





Gracias
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:25.