2010-01-17 227 views
18

我想重定向所有www.domain.com請求用PHP domain.com的,基本上是:WWW非WWW重定向用PHP

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

不過,我想保持請求的URL像SO ,對於如:

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

應該重定向到:

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

我不想依靠.htaccess解決方案,一個d我不確定哪些$_SERVER變數我不得不用來做到這一點。另外,保留HTTPS協議將是一個優點。

我該怎麼做?

+2

這對於使用Apache的mod_rewrite而不是PHP來說更容易;這樣它就已經在應用層被涉及之前完成了。 – 2010-01-17 02:31:41

+2

@Charles:我知道,但我沒有使用Apache,我需要一個便攜式解決方案。 – 2010-01-17 02:40:35

回答

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

而且應該有效。

順便說一句,這是谷歌推薦的方法,因爲它保持https://完好無損,以及端口等,如果你使用它們。


正如甘博指出,他使用$_SERVER['HTTP_HOST'],因爲它來自於頭,而不是服務器,從而$_SERVER['SERVER_*']並不可靠。你可以用$_SERVER['HTTP_HOST']替換一些$_SERVER['SERVER_NAME'],它應該以同樣的方式工作。

+0

我過去曾經這樣做過,但不記得我放置代碼的位置。非常好,謝謝! =) – 2010-01-17 00:11:51

+0

感謝您的澄清,我會牢記在心。 – 2010-01-17 00:14:52

+0

HTTP_HOST對我來說效果更好。 SERVER_NAME不包含www。在我的服務器上。 – Grzegorz 2014-12-19 15:11:28

32

試試這個:

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; 
} 
+1

+1,很好的一行,謝謝! – 2010-01-17 00:12:59

+0

謝謝。我怎麼能修改你的代碼也重定向https爲http,因爲我目前沒有證書?所以我試圖將www重定向到非www和https同時http到 – 2017-11-22 17:58:02

+0

我嘗試了其中兩個,一個用於www-> non和一個用於https(沒有www)到http,但由於也無法加載頁面很多重定向(一旦if語句生效,它現在對另一個if語句有效,所以它重定向太多次了)...試圖一次性完成所有操作,但是沒有運氣。 – 2017-11-22 20:43:11

1

如果(isset($ _ SERVER [ 'HTTPS'])& &!空($ _ SERVER [ 'HTTPS'])& &                                                                                                                                                                                (用strtolower($ _ SERVER [ 'HTTPS'])!= '關閉')){
                      $ https = 1;
}否則{
                      $ HTTPS = 0;
}
如果(SUBSTR($ _ SERVER [ 'HTTP_HOST'],0,4)!== 'WWW'){
                      重定向(($ HTTPS? https://':'http://')。'。'。                                                                                                                                    $ _SERVER [ 'HTTP_HOST'] $ _ SERVER [ 'REQUEST_URI'])。
}