使用 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:是不是可以仅使用一个重定向来完成?