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

Posted

技术标签:

【中文标题】使用 PHP 将 WWW 重定向到非 WWW 重定向【英文标题】:WWW to non-WWW Redirect with PHP 【发布时间】:2011-01-05 23:20:39 【问题描述】:

我想用 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.***.com/questions/tagged/php?foo=bar

应该重定向到:

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

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

我应该怎么做?

【问题讨论】:

使用 Apache 的 mod_rewrite 比 PHP 更容易做到这一点;这样一来,在涉及应用层之前就已经完成了。 @Charles:我知道,但我没有使用 Apache,我需要一个可移植的解决方案。 【参考方案1】:

试试这个:

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;

【讨论】:

谢谢。由于我目前没有证书,我如何修改您的代码以将 https 重定向到 http?所以我试图同时将 www 重定向到非 www 和 https 到 http 我尝试了其中两个,一个用于 www->non,一个用于 https(没有 www)到 http,但是由于重定向过多,页面无法加载(一旦一个 if 语句生效,它现在对另一个 if 语句有效,因此它重定向了太多次)...试图一口气完成所有操作,但还没有运气。 我的 'example.com' 代码:if (substr($_SERVER['HTTP_HOST'], 0, 4) === 'exam') header('Location: http://' . substr($_SERVER['HTTP_HOST'], 0).$_SERVER['REQUEST_URI']); exit; //后跟第二个 if 语句://if (substr($_SERVER['HTTP_HOST'], 0, 4) === 'www.') header('Location: http://' . substr($_SERVER['HTTP_HOST'], 4).$_SERVER['REQUEST_URI']); exit; 【参考方案2】:
$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_*'] 不那么可靠。您可以将 some$_SERVER['SERVER_NAME'] 替换为 $_SERVER['HTTP_HOST'],它应该以相同的方式工作。

【讨论】:

我以前做过这个,但不记得我把代码放在哪里了。效果很好,谢谢! =) HTTP_HOST 对我来说效果更好。 SERVER_NAME 不包括 www。在我的服务器上。【参考方案3】:

如果 (((isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == 'https') || (isset($_SERVER["HTTPS"]) && strtolower( $_SERVER["HTTPS"])=="on")))            $https = 1; 其他 $https = 0; if (substr($_SERVER['HTTP_HOST'], 0, 4) !== 'www.') header('location:', ($https?'https://':'http://') .'www.' .                                                                           $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);

【讨论】:

以上是关于使用 PHP 将 WWW 重定向到非 WWW 重定向的主要内容,如果未能解决你的问题,请参考以下文章

使用 rewrite_mod 将 index.php 重定向到 root,并将 www 重定向到非 www [重复]

htaccess 将 www 重定向到非 www 仍然将 .php 扩展名放在 uri 中

IIS 将 www 重定向到非 www 和 http 到 https:是不是可以仅使用一个重定向来完成?

域重定向到www时如何将www子域重定向到非www

apache将http重定向到https,将www重定向到非www

如何通过 web.config 将 http 重定向到 https 并将 www 重定向到非 www?