Ali*_*xel 22 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();
}
Run Code Online (Sandbox Code Playgroud)
但是,我确实希望像在SO中一样维护请求的URL,例如:
http://www.stackoverflow.com/questions/tagged/php?foo=bar
Run Code Online (Sandbox Code Playgroud)
应重定向到:
http://stackoverflow.com/questions/tagged/php?foo=bar
Run Code Online (Sandbox Code Playgroud)
我不想依赖.htaccess解决方案,而且我不确定$_SERVER我必须使用哪些变量来实现这一目标.此外,保留HTTPS协议将是一个加号.
我该怎么做?
Gum*_*mbo 38
试试这个:
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;
}
Run Code Online (Sandbox Code Playgroud)
Tyl*_*ter 12
$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);
Run Code Online (Sandbox Code Playgroud)
将用户重定向到完全相同的页面,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;
Run Code Online (Sandbox Code Playgroud)
那应该有用.
顺便说一句,这是谷歌推荐的方法,因为它保持https://完整,以及端口等,如果你使用它们.
正如Gumbo所指出的那样,他使用的$_SERVER['HTTP_HOST']是头文件而不是服务器,因此$_SERVER['SERVER_*']不那么可靠.您可以取代一些$_SERVER['SERVER_NAME']带$_SERVER['HTTP_HOST'],它应该工作方式相同.