2012-06-05 25 views
6

Sé que esto es una pregunta muy común, pero no pude encontrar la respuestaphp redirección no cambia la url

Me'v un post.php, que presenten un formulario de envío a controller.php Cuando que va a la derecha, en el controlador que hace:

header("Location: ./post?ok=1"); 

el mensaje es en realidad inserta, y que pasa a través de la línea anterior, pero la url en el navegador no parece haber cambiado, y al final no hay permiso Param,

Podría usar la variable de sesión para almacenar e un parámetro tal éxito/fracaso, pero de esta manera debería estar trabajando

post.php:

<form action="controller" method="post"> 
    <input name="test" value='test' type="text" /> 
    <input type="submit" value="post" /> 
</form> 

controller.php:

<?php 
    header("Location: ./post?ok=1"); 
?> 

Edición 1:

header("Refresh:1;url=http://localhost/test/post?ok=1"); //doesn't work better 

Editar 2:

en la parte superior post.php He puesto

debug("post l ".count($_POST)); 
debug("get l ".count($_GET)); 

muestran de 0 antes de enviar, y 0 después también

Edit3: funciona

fue bloqueado por:

if ($success){ 
    header("Location: ./post?ok=1"); 
} 
header("Location: ./post"); 

que debería ser:

if ($success){ 
    header("Location: ./post?ok=1"); 
} else { 
    header("Location: ./post"); 
} 

THX todo

+1

Creo que no has dado ACTION de la etiqueta del formulario correctamente ... debería ser algo así como

Has perdido la extensión del archivo. –

+0

¿Estás seguro de que se ejecutó la función principal? – xdazz

+0

sí, puse una depuración ('test') allí –

Respuesta

3

En primer lugar usted no debe usar $_SERVER['HTTP_REFERER'] esto es inseguro. También es posible que el cliente no envíe este encabezado de todos modos. En este momento, no sé cómo, pero estoy seguro de que esto podría usarse para secuestrar tu sitio por algo malvado.

Mejor que sepas de dónde provienen los datos del formulario y redirigir al usuario hacia atrás.

Por cierto, su redirección tal vez no funcione como se esperaba porque la url ya contiene un questionmark. Por lo tanto, debe agregar más parámetros con un signo &.

Para la redirección sugeriría el estado de respuesta HTTP 302 Found. Pero debes asegurarte de que no se envíe nada más antes. No debe haber ninguna salida HTML o líneas vacías antes de que esta línea de header siguiente:

header("Location: http://".$_SERVER['HTTP_HOST']."/your/source.form", true, 302); 
+0

He puesto el encabezado ("Location: ./post?ok") ; y no funciona mejor, editó la pregunta –

+0

En los redireccionamientos es mejor usar URL completas. Las URL relativivas son * malas * allí el navegador puede confundirse con la fuente y la URL de destino. ¿En qué URL debería estar relacionada la redirección? – rekire

+0

He intentado cualquiera de los encabezados ("Ubicación: http: // localhost/test/post? Ok = 1"); y encabezado ("Refresh: 0; url = http: // localhost/test/post? ok = 1"); no funciona todavía –

3

intente utilizar el código de estado HTTP 303 Ver Oter:

header("Location: your/location", true, 303); 
+0

desafortunadamente es lo mismo –

1

Puede haber algunos problemas en el lado del servidor (por ejemplo, su código imprime algo antes de configurar los encabezados). Para depurar esto, necesita establecer display_errors = On en su php.ini o habilitarlo temporalmente en su código con ini_set('display_errors', 1).

En la mayoría de los casos, el error es "Cannot modify header information - headers already sent.". Asegúrese de que no hay print, echo o cualquier espacio y línea adicional blanca después de PHP etiqueta de cierre (?>)

+0

No recibí estos errores, y el controlador no hace eco de html o algo así, solo hay algunas llamadas a php_curl y header() redirige –

1

Esto podría un problema de una segunda redirección por el servidor.

header('Location: post.php?ok=1', true, 303); 
exit; 

tratar de añadir la extensión .php a la URL, para asegurarse, que el puesto ? Ok = 1 no es redirigido a post.php por el servidor (por ejemplo .htaccess). En la redirección adicional, puede perder los parámetros de obtención. Entonces no olvides agregar una salida después del redireccionamiento del encabezado.

0

En realidad ... parece que no está siguiendo la llamada del encabezado() con "exit". Ejemplos:

header('location: ' . $location); exit; 

header('location: ' . $location, true, 301); exit; 

Cuando "salida" después de la llamada, la dirección URL se cambia en la barra de direcciones del navegador porque se evita el código de continuar la ejecución. De lo contrario, el código continúa ejecutándose, lo que provoca que la URL permanezca sin cambios.

Cuestiones relacionadas