WWW to non-WWW Redirect with PHP
if (((isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == 'https') || (isset($_SERVER["HTTPS"]) && strtolower($_SERVER["HTTPS"])=="on"))) {
$https = 1;
} else {
$https = 0;
}
if (substr($_SERVER['HTTP_HOST'], 0, 4) !== 'www.') {
header('location:', ($https?'https://':'http://') .'www.' . $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
}
$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);
Would redirect the user to the exact same page, www. intact.
So, to get rid of the www. , we just replace one line:
$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;
And that should work.
By the way, this is the method that is recommended by Google, as it keeps https://
intact, along with ports and such if you do use them.
As Gumbo pointed out, he uses $_SERVER['HTTP_HOST']
as it comes from the headers instead of the server, thus $_SERVER['SERVER_*']
is not as reliable. You could replace some$_SERVER['SERVER_NAME']
with $_SERVER['HTTP_HOST']
, and it should work the same way.
Try this:
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;
}