2010-01-17 3 views
18

Ich möchte alle www.domain.com Anfragen umleiten mit PHP DOMAIN.COM, im Grunde:WWW zu Nicht-WWW Redirect mit PHP

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

Jedoch habe ich wie in SO die angeforderte URL halten wollen zum Beispiel:

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

Sollte Umleitung auf:

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

ich will nicht auf .htaccess Lösungen angewiesen, eine d Ich bin unsicher, welche $_SERVER Vars ich verwenden müsste, um dies zu ermöglichen. Außerdem wäre das Beibehalten des HTTPS-Protokolls ein Plus.

Wie soll ich das tun?

+2

Dies ist viel einfacher mit Apache mod_rewrite statt PHP zu tun; So ist es schon gemacht, bevor die App-Ebene überhaupt involviert ist. –

+2

@Charles: Ich weiß, aber ich benutze nicht Apache und ich brauche eine tragbare Lösung. –

Antwort

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

Wäre umleiten den Benutzer auf die exakt gleiche Seite, www. intakt.

Also, um das www loszuwerden. nur eine Zeile ersetzen, wir:

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

Und das sollte funktionieren.

Übrigens ist dies die Methode, die von Google empfohlen wird, da es https:// intakt hält, zusammen mit Ports und so, wenn Sie sie verwenden.


Wie Gumbo wies darauf hin, er nutzt $_SERVER['HTTP_HOST'], wie es aus den Headern anstelle des Servers enthalten ist, so ist $_SERVER['SERVER_*'] nicht so zuverlässig. Sie könnten einige $_SERVER['SERVER_NAME'] durch $_SERVER['HTTP_HOST'] ersetzen, und es sollte genauso funktionieren.

+0

Ich hatte das in der Vergangenheit getan, konnte mich aber nicht erinnern, wo ich den Code platziert habe. Funktioniert super, danke! =) –

+0

Danke für die Klarstellung, das werde ich mir merken. –

+0

HTTP_HOST funktioniert besser für mich. SERVER_NAME enthält nicht www. auf meinem Server. – Grzegorz

32

Versuchen Sie folgendes:

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, Nizza Einliner, danke! –

+0

Danke. Wie könnte ich Ihren Code ändern, um https auch auf http umzuleiten, da ich momentan kein Zertifikat habe? Also ich versuche, www zu non www und https zu http simultan zu simulieren –

+0

Ich habe versucht, zwei von diesen, einen für www-> non und einen für https (ohne www) zu http, aber Seite fehlschlägt zu laden, auch zu viele Umleitungen (sobald eine if-Anweisung wirksam wird, ist sie jetzt für die andere if-Anweisung gültig, so dass sie zu oft umgeleitet wird) ... zu versuchen, alles auf einmal zu bekommen, aber noch kein Glück. –

1

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