WWW для перенаправления без WWW с PHP - PullRequest
20 голосов
/ 17 января 2010

Я хочу перенаправить все запросы www.domain.com на domain.com с помощью PHP, в основном:

if (substr($_SERVER['SERVER_NAME'], 0, 4) === 'www.')
{
    header('Location: http://' . substr($_SERVER['SERVER_NAME'], 4)); exit();
}

Однако я хочу сохранить запрошенный URL, как, например, в SO, например ::100100

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

Следует перенаправить на:

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

Я не хочу полагаться на .htaccess решения, и я не уверен, какие $_SERVER переменные мне придется использовать, чтобы это произошло. Кроме того, сохранение протокола HTTPS было бы плюсом.

Как мне это сделать?

Ответы [ 3 ]

36 голосов
/ 17 января 2010

Попробуйте это:

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;
}
11 голосов
/ 17 января 2010
$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:// без изменений, наряду с портами и т. Д., Если вы их используете.


Как указал Гамбо, он использует $_SERVER['HTTP_HOST'], поскольку он исходит от заголовков вместо сервера, поэтому $_SERVER['SERVER_*'] не так надежен. Вы могли бы заменить $_SERVER['SERVER_NAME'] на $_SERVER['HTTP_HOST'], и это должно работать так же.

1 голос
/ 19 августа 2015

if (isset ($ _ SERVER ['HTTPS']) &&! Empty ($ _ SERVER ['HTTPS']) && (strtolower ($ _ SERVER ['HTTPS'])! = 'Off')) {
$ https = 1;
} else {
$ https = 0;
}
if (substr ($ _ SERVER ['HTTP_HOST'], 0, 4)! == 'www.') {
редирект (($ https? 'https://':'http://') .'www.'. $ _SERVER ['HTTP_HOST']. $ _ SERVER ['REQUEST_URI']);
}

...