一尘不染

使用PHP将WWW重定向到非WWW重定向

php

我想使用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协议将是一个加号。

我应该怎么做?


阅读 317

收藏
2020-05-29

共1个答案

一尘不染

$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'],并且应该以相同的方式工作。

2020-05-29