使用PHP进行非WWW重定向的WWW

时间:2010-01-17 00:05:00

标签: php redirect no-www

我想用PHP将所有www.domain.com请求重定向到domain.com,基本上是:

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

但是我确实希望像在SO中一样维护所请求的URL,例如:

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

应重定向到:

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

我不想依赖.htaccess解决方案,而且我不确定我必须使用哪些$_SERVER变量才能实现这一点。此外,保留HTTPS协议将是一个加号。

我该怎么做?

3 个答案:

答案 0 :(得分:36)

试试这个:

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 :(得分:11)

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

将用户重定向到完全相同的页面,www。完整。

所以,摆脱www。 ,我们只需更换一行:

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

这应该有用。

顺便说一句,这是Google推荐的方法,因为它保持https://完整,以及端口等,如果您使用它们。


正如Gumbo所指出的那样,他使用$_SERVER['HTTP_HOST']来源于标题而不是服务器,因此$_SERVER['SERVER_*']不可靠。您可以将某些$_SERVER['SERVER_NAME']替换为$_SERVER['HTTP_HOST'],它应该以相同的方式工作。

答案 2 :(得分:1)

if(isset($ _ SERVER ['HTTPS'])&&!empty($ _ SERVER ['HTTPS'])&&(strtolower($ _ SERVER ['HTTPS'])!='off' )){             
$ https = 1;
        其他{
            $ https = 0;
        }
        if(substr($ _ SERVER ['HTTP_HOST'],0,4)!=='www。'){
            重定向(($ https?'https://':'http://')。'¯。'。$ _SERVER ['HTTP_HOST']。$ _ SERVER ['REQUEST_URI']);
        }