2010-01-17 29 views
18

Quiero redirigir todas las solicitudes de www.domain.com Domain.com con PHP, básicamente:WWW para no WWW redirección con PHP

if (substr($_SERVER['SERVER_NAME'], 0, 4) === 'www.') 
{ 
    header('Location: http://' . substr($_SERVER['SERVER_NAME'], 4)); exit(); 
} 

Sin embargo, yo quiero mantener la URL solicitada al igual que en el SO , por ejemplo:

http://www.stackoverflow.com/questions/tagged/php?foo=bar 

debe redireccionar a:

http://stackoverflow.com/questions/tagged/php?foo=bar 

no quiero depender de .htaccess soluciones, una d No estoy seguro de qué vatios $_SERVER tendré que usar para que esto suceda. Además, preservar el protocolo HTTPS sería una ventaja.

¿Cómo debo hacer esto?

+2

Esto es mucho más fácil de hacer con mod_rewrite de Apache que con PHP; de esa manera ya se ha hecho antes de que la capa de la aplicación esté involucrada. –

+2

@Charles: Lo sé, pero no estoy usando Apache y necesito una solución portátil. –

Respuesta

10
$pageURL = (@$_SERVER["HTTPS"] == "on") ? "https://" : "http://"; 
if ($_SERVER["SERVER_PORT"] != "80") 
{ 
    $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"]; 
} 
else 
{ 
    $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"]; 
} 
header('Location: '. $pageURL); 

Redirigir al usuario a la misma página, www. intacto.

Por lo tanto, para deshacerse de la www. , simplemente reemplazamos una línea:

$pageURL = (@$_SERVER["HTTPS"] == "on") ? "https://" : "http://"; 
if ($_SERVER["SERVER_PORT"] != "80") 
{ 
    $pageURL .= substr($_SERVER['SERVER_NAME'], 4).":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"]; 
} 
else 
{ 
    $pageURL .= substr($_SERVER['SERVER_NAME'], 4).$_SERVER["REQUEST_URI"]; 
} 
return $pageURL; 

Y eso debería funcionar.

Por cierto, este es el método recomendado por Google, ya que mantiene https:// intacto, junto con los puertos y tal si los usa.


Como se señaló Gumbo, que utiliza $_SERVER['HTTP_HOST'] ya que proviene de las cabeceras en lugar del servidor, por lo tanto $_SERVER['SERVER_*'] no es tan fiable. Puede reemplazar algunos $_SERVER['SERVER_NAME'] con $_SERVER['HTTP_HOST'], y debería funcionar de la misma manera.

+0

Lo hice en el pasado, pero no recuerdo dónde coloqué el código. Funciona muy bien, gracias! =) –

+0

Gracias por la aclaración, lo tendré en cuenta. –

+0

HTTP_HOST funciona mejor para mí. SERVER_NAME no incluye www. en mi servidor – Grzegorz

32

Prueba esto:

if (substr($_SERVER['HTTP_HOST'], 0, 4) === 'www.') { 
    header('Location: http'.(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS']=='on' ? 's':'').'://' . substr($_SERVER['HTTP_HOST'], 4).$_SERVER['REQUEST_URI']); 
    exit; 
} 
+1

+1, buen trazador de líneas, gracias! –

+0

Gracias. ¿Cómo podría modificar su código para también redirigir https a http, ya que actualmente no tengo un certificado? Así que estoy tratando de redirigir www a no www y https a http simultáneamente –

+0

Intenté tener dos de estos, uno para www-> no y uno para https (sin www) a http, pero la página no se carga debido a que también muchos redireccionamientos (una vez que una instrucción if tenga efecto, ahora es válida para la otra instrucción if, por lo que redirige demasiadas veces) ... tratando de obtenerlo todo de una vez pero sin suerte todavía. –

1

if (isset ($ _ SERVER [ 'HTTPS']) & &!vacío ($ _ SERVER [ 'HTTPS']) & &                                                                                                                                                                                 (strtolower ($ _ SERVER [ 'HTTPS'])! = 'Off')) {
                      $ https = 1;
} else {
                      $ https = 0;
}
si (substr ($ _ SERVER [ 'HTTP_HOST'], 0, 4)! == 'www.') {
                      redirección (($ https?' https: // ':' http: // ') .'www.'.                                                                                                                            $ _SERVER [ 'HTTP_HOST'] $ _ SERVER [ 'REQUEST_URI']).;
}

Cuestiones relacionadas