web-dev-qa-db-ja.com

WWWから非WWWへのリダイレクトPHP

基本的に、すべてのwww.domain.comリクエストをPHPを使用して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プロトコルを維持することはプラスになります。

どうすればよいですか?

22
Alix Axel
$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を取り除くために。 、1行を置き換えるだけです:

$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;

そして、それはうまくいくはずです。

ちなみに、これはグーグルが推奨する方法であり、https://をそのまま保持し、ポートなどを使用する場合はそのままにします。


Gumboが指摘したように、サーバーではなくヘッダーから取得されるため、$_SERVER['HTTP_Host']を使用するため、$_SERVER['SERVER_*']の信頼性は低くなります。 some$_SERVER['SERVER_NAME']$_SERVER['HTTP_Host']に置き換えることができ、同じように機能するはずです。

12
Tyler Carter

これを試して:

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;
}
39
Gumbo

if(isset($ _ SERVER ['HTTPS'])&&!empty($ _ SERVER ['HTTPS'])&& SERVER(from)
$ https = 1;
} そうしないと {
$ https = 0;
}
if(substr($ _ SERVER ['HTTP_Host']、0、4)!== 'www。'){
redirect(($ https? 'https://': 'http://')。'www。 '。'サーバーURI
}

1
amar nath jena