【问题标题】:WWW to non-WWW Redirect with PHP使用 PHP 将 WWW 重定向到非 WWW 重定向
【发布时间】: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.stackoverflow.com/questions/tagged/php?foo=bar

应该重定向到:

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

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

我应该怎么做?

【问题讨论】:

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

标签: php redirect


【解决方案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']);
}

【讨论】:

    猜你喜欢
    • 2018-06-06
    • 1970-01-01
    • 2018-07-18
    • 2017-11-24
    • 2017-03-24
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    相关资源
    最近更新 更多