2010-01-17 13 views
18

Je veux rediriger toutes les demandes de www.domain.com DOMAIN.COM avec PHP, essentiellement:WWW à Redirect non WWW avec PHP

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

Cependant, je ne veux maintenir l'URL demandée comme dans SO , par exemple:

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

Si une redirection vers:

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

Je ne veux pas compter sur .htaccess solutions, un d Je ne sais pas quelles vars $_SERVER je devrais utiliser pour que cela se produise. De plus, préserver le protocole HTTPS serait un plus.

Comment est-ce que je devrais faire ceci?

+2

Ceci est beaucoup plus facile à faire avec mod_rewrite d'Apache plutôt que PHP; De cette façon, cela a déjà été fait avant que la couche de l'application ne soit impliquée. –

+2

@Charles: Je sais, mais je n'utilise pas Apache et j'ai besoin d'une solution portable. –

Répondre

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); 

Redirige l'utilisateur vers la même page, www. intact.

Donc, pour se débarrasser du www. , nous venons de remplacer une ligne:

$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; 

Et cela devrait fonctionner. D'ailleurs, c'est la méthode recommandée par Google, car elle conserve https:// intact, ainsi que les ports et autres si vous les utilisez.


Comme Gumbo a fait remarquer, il utilise $_SERVER['HTTP_HOST'] comme il vient de les en-têtes au lieu du serveur, donc $_SERVER['SERVER_*'] est pas aussi fiable. Vous pouvez remplacer certains $_SERVER['SERVER_NAME'] par $_SERVER['HTTP_HOST'], et cela devrait fonctionner de la même manière.

+0

Je l'avais fait dans le passé, mais je ne me souvenais plus où j'avais placé le code. Fonctionne très bien, merci! =) –

+0

Merci pour la clarification, je garderai cela à l'esprit. –

+0

HTTP_HOST fonctionne mieux pour moi. SERVER_NAME n'inclut pas www. sur mon serveur. – Grzegorz

32

Essayez ceci:

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, Nice one-liner, merci! –

+0

Merci. Comment puis-je modifier votre code pour rediriger aussi https vers http, puisque je n'ai pas actuellement de certificat? Donc, j'essaie de rediriger www à non www et https à http simultanément –

+0

J'ai essayé d'avoir deux d'entre eux, un pour www-> non et un pour https (sans www) à http, mais la page ne parvient pas à charger en raison de trop de nombreuses redirections (une fois qu'une instruction if prend effet, elle est maintenant valide pour l'autre if si elle redirige trop de fois) ... essayant de tout obtenir en une seule fois mais pas de chance pour le moment. –

1

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

Questions connexes