PHP常用SERVER解析

最近在折騰一個半開源的建站程序(什麼叫半開源?你懂得!),給客戶把模板做好了,網站放到服務器上了,客戶那邊把數據也都上傳了很多,但是突然發現分頁出現了問題,域名成了 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 的值就是 IPSERVER_NAME 就不會變化,Apachehttpd.conf 中設置的是什麼,顯示的就是什麼。

沒看明白?那就繼續往下看

相同點:

當滿足以下三個條件時,兩者會輸出相同信息。

  1. 服務器爲80端口

  2. apache 的 conf 中 ServerName 設置正確

  3. HTTP/1.1 協議規範

不同點:

  1. 通常情況:
    _SERVER[“HTTP_HOST”] :在HTTP/1.1協議規範下,會根據客戶端的 HTTP 請求輸出信息。
    _SERVER[“SERVER_NAME”] :默認情況下直接輸出 apache 的配置文件 httpd.conf 中的 ServerName 值。

  2. 當服務器爲非80端口時:
    _SERVER[“HTTP_HOST”] :會輸出端口號,例如:abc.com:8080
    _SERVER[“SERVER_NAME”] :會直接輸出 ServerName 值

因此在這種情況下,可以理解爲:HTTP_HOST = SERVER_NAME : SERVER_PORT

  1. 當配置文件 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 認證功能,這個變量便是認證的類型

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章