2012-02-20 17 views
43

Estoy considerando utilizar el siguiente código durante la fase de inicio de un sitio web para mostrar a los usuarios un página de mantenimiento mientras me muestra el resto del sitio.301 o 302 redirección con PHP

¿Hay alguna forma de mostrar el estado correcto de reorientación 302 a los motores de búsqueda o debería buscar otro enfoque basado en .htaccess?

$visitor = $_SERVER['REMOTE_ADDR']; 
if (preg_match("/192.168.0.1/",$visitor)) { 
    header('Location: http://www.yoursite.com/thank-you.html'); 
} else { 
    header('Location: http://www.yoursite.com/home-page.html'); 
}; 
+11

Recuerde 'salir' de su script después de estos encabezados – Vitamin

Respuesta

96

Para una 302 Found, es decir, una redirección temporal hacer:

header('Location: http://www.yoursite.com/home-page.html'); 
// OR: header('Location: http://www.yoursite.com/home-page.html', true, 302); 
exit; 

Si necesita una redirección permanente, también conocido como: 301 Moved Permanently, hacer:

header('Location: http://www.yoursite.com/home-page.html', true, 301); 
exit; 

Para obtener más información cheque el manual de PHP para el header function Doc. Además, no se olvide de llamar al usar exit;header('Location: ');

Pero, teniendo en cuenta que está haciendo un mantenimiento temporal (que no quiere que el índice de los motores de búsqueda de su página) se aconseja para devolver un 503 Service Unavailable con un mensaje personalizado (por ejemplo, que no es necesario ningún redireccionamiento):

<?php 
header("HTTP/1.1 503 Service Unavailable"); 
header("Status: 503 Service Unavailable"); 
header("Retry-After: 3600"); 
?><!DOCTYPE html> 
<html> 
<head> 
<title>Temporarily Unavailable</title> 
<meta name="robots" content="none" /> 
</head> 
<body> 
    Your message here. 
</body> 
</html> 
+6

La sintaxis es 'void header (cadena $ string [, bool $ replace = true [, int $ http_response_code]])' - http://php.net/manual /en/function.header.php – Vitamin

+3

OP solicitó la redirección durante el mantenimiento, en ese caso debe hacer una redirección temporal con 302, no 301. En el caso de la redirección permanente 301 aka, el navegador nunca intentará esa página sino que irá a la redireccionada. – seven

+0

¿Alguna vez alguien va a mencionar que este "yoursite.com" solo hace que mi escudo antivirus informe varias "amenazas que se han detectado"? ¿Por qué no usas example.com en tu respuesta? Háganos un favor a todos y actualice su publicación a example.com, porque yoursite.com es un malware. Y cuando pruebo tu código me redirige al malware. Ty para la respuesta correcta, pero en serio ... corrige este wtf. –

3

¿Revisaste qué encabezado recibes? Porque deberías obtener un 302 con el anterior.

Del manual: http://php.net/manual/en/function.header.php

El segundo caso especial es el "Lugar:" encabezado. No solo devuelve este encabezado al navegador, sino que también devuelve un código de estado REDIRECT (302) al navegador, a menos que el código de estado 201 o 3xx ya se haya configurado.

<?php 
header("Location: http://www.example.com/"); /* Redirect browser */ 

/* Make sure that code below does not get executed when we redirect. */ 
exit; 
?> 
3

Desde el PHP documentation:

el segundo caso especial es el "Lugar:" encabezado. No solo devuelve este encabezado al navegador, sino que también devuelve un código de estado REDIRECT (302) al navegador, a menos que el código de estado 201 o 3xx ya se haya configurado.

por lo que ya está haciendo lo correcto.

16

El siguiente código emitirá un redireccionamiento 301.

header('Location: http://www.example.com/', true, 301); 
exit; 
4

No creo que realmente importe cómo hacerlo, desde PHP o htaccess. Ambos lograrán lo mismo.

Lo único que quiero señalar es si desea que los motores de búsqueda comiencen a indexar su sitio en esta fase de "mantenimiento" o no. Si no es, puede usar el código de estado 503 ("temporalmente abajo").He aquí un ejemplo .htaccess:

RewriteEngine on 
RewriteCond %{ENV:REDIRECT_STATUS} !=503 
RewriteCond %{REMOTE_HOST} ^192\.168\.0\.1 
ErrorDocument 503 /redirect-folder/index.html 
RewriteRule !^s/redirect-folder$ /redirect-folder [L,R=503] 

En PHP:

header('Location: http://www.yoursite.com/redirect-folder/index.html', true, 503); 
exit; 

Con el código PHP redirección actual que está utilizando, la redirección es un (predeterminado) 302.

Cuestiones relacionadas