最近在折騰一個半開源的建站程序(什麼叫半開源?你懂得!),給客戶把模板做好了,網站放到服務器上了,客戶那邊把數據也都上傳了很多,但是突然發現分頁出現了問題,域名成了 localhost ,然後就是各種查找原因,重新安裝部署,問題依舊沒法解決,將文件和數據庫全部搬到本地來確是好好的。
折騰了好久,最後沒辦法了看了看分頁程序是怎麼寫的,原來是 _SERVER[“SERVER_NAME”] 惹的禍,服務器是 linux 的,_SERVER[“SERVER_NAME”] 的值是 Apache 的 httpd.conf 中設置的,改成 _SERVER[“HTTP_HOST”] 後就好了,下面整理下
這兩個方法的區別:
簡單的來說,HTTP_HOST 是變化的,而 SERVER_NAME 只有一個。
比如,你現在機器上的一個網站 http://www.abc.com ,這個網站也可以通過 http://localhost 來訪問,指向同一個目錄。
如果你在瀏覽器用 http://localhost 訪問,則 HTTP_HOST 的值爲 localhost ,而你用 www.abc.com 訪問,HTTP_HOST 的值就是 www.abc.com ,你用IP地址訪問,HTTP_HOST 的值就是 IP,SERVER_NAME 就不會變化,Apache 的httpd.conf 中設置的是什麼,顯示的就是什麼。
沒看明白?那就繼續往下看
相同點:
當滿足以下三個條件時,兩者會輸出相同信息。
-
服務器爲80端口
-
apache 的 conf 中 ServerName 設置正確
-
HTTP/1.1 協議規範
不同點:
-
通常情況:
_SERVER[“HTTP_HOST”] :在HTTP/1.1協議規範下,會根據客戶端的 HTTP 請求輸出信息。
_SERVER[“SERVER_NAME”] :默認情況下直接輸出 apache 的配置文件 httpd.conf 中的 ServerName 值。 -
當服務器爲非80端口時:
_SERVER[“HTTP_HOST”] :會輸出端口號,例如:abc.com:8080
_SERVER[“SERVER_NAME”] :會直接輸出 ServerName 值
因此在這種情況下,可以理解爲:HTTP_HOST = SERVER_NAME : SERVER_PORT
- 當配置文件 httpd.conf 中的 ServerName 與 HTTP/1.0 請求的域名不一致時:
httpd.conf 配置如下:
<virtualhost *>
ServerName w3h5.com
ServerAlias www.w3h5.com
</virtualhost>
客戶端訪問域名 www.abc.com
_SERVER[“HTTP_HOST”] 輸出 www.abc.com
_SERVER[“SERVER_NAME”] 輸出 abc.com
所以,在實際程序中,應儘量使用 _SERVER[“HTTP_HOST”] ,比較保險和可靠,當然在不同的需求中會有不同的用法。
下面是其他一些有關 PHP 中 $_SERVER 的具體說明:
$_SERVER[‘REMOTE_PORT’] :端口。
$_SERVER[‘HTTP_HOST’]:當前請求的 Host: 頭部的內容。
$_SERVER[‘SERVER_NAME’] :服務器主機的名稱。
$_SERVER[‘SERVER_PORT’] :服務器所使用的端口
$_SERVER[‘PHP_SELF’] :正在執行腳本的文件名
$_SERVER[‘argv’]:傳遞給該腳本的參數。
$_SERVER[‘argc’]:傳遞給程序的命令行參數的個數。
$_SERVER[‘GATEWAY_INTERFACE’] :CGI 規範的版本。
$_SERVER[‘SERVER_SOFTWARE’]:服務器標識的字串
$_SERVER[‘SERVER_PROTOCOL’]:請求頁面時通信協議的名稱和版本
$_SERVER[‘REQUEST_METHOD’] :訪問頁面時的請求方法
$_SERVER[‘QUERY_STRING’] :查詢(query)的字符串。
$_SERVER[‘DOCUMENT_ROOT’] :當前運行腳本所在的文檔根目錄
$_SERVER[‘HTTP_ACCEPT’] :當前請求的 Accept: 頭部的內容。
$_SERVER[‘HTTP_ACCEPT_CHARSET’] :當前請求的 Accept-Charset: 頭部的內容。
$_SERVER[‘HTTP_ACCEPT_ENCODING’] :當前請求的 Accept-Encoding: 頭部的內容
$_SERVER[‘HTTP_CONNECTION’] :當前請求的 Connection: 頭部的內容。例如:“Keep-Alive”。
$_SERVER[‘HTTP_REFERER’] :鏈接到當前頁面的前一頁面的 URL 地址。
$_SERVER[‘HTTP_USER_AGENT’] :當前請求的 User_Agent: 頭部的內容。
$_SERVER[‘HTTPS’] :如果通過https訪問,則被設爲一個非空的值(on),否則返回off
$_SERVER[‘SCRIPT_FILENAME’] :當前執行腳本的絕對路徑名。
$_SERVER[‘SERVER_ADMIN’] :管理員信息
$_SERVER[‘SERVER_PORT’] :服務器所使用的端口
$_SERVER[‘SERVER_SIGNATURE’] :包含服務器版本和虛擬主機名的字符串。
$_SERVER[‘PATH_TRANSLATED’] :當前腳本所在文件系統(不是文檔根目錄)的基本路徑。
$_SERVER[‘SCRIPT_NAME’] :包含當前腳本的路徑。這在頁面需要指向自己時非常有用。
$_SERVER[‘PHP_AUTH_USER’] :當 PHP 運行在 Apache 模塊方式下,並且正在使用 HTTP 認證功能,這個變量便是用戶輸入的用戶名。
$_SERVER[‘PHP_AUTH_PW’] :當 PHP 運行在 Apache 模塊方式下,並且正在使用 HTTP 認證功能,這個變量便是用戶輸入的密碼。
$_SERVER[‘AUTH_TYPE’] :當 PHP 運行在 Apache 模塊方式下,並且正在使用 HTTP 認證功能,這個變量便是認證的類型