在網絡傳輸過程中,信息的安全性是一直以來被關注的重點之一。加密協議是保證網絡傳輸過程中信息安全性的重要手段,其中HTTPS協議是互聯網中應用最廣泛的一種加密協議。而在PHP中,使用get_headers()函數獲取HTTPS網址的響應頭信息時,需要注意的問題也是非常重要的。
舉個例子,現在我們需要獲取鏈接為https://www.baidu.com的網站響應頭信息:
$headers = get_headers("https://www.baidu.com"); print_r($headers);
在不使用SSL證書的情況下,會返回如下錯誤信息:
PHP Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in xxx.php on line xx
這個錯誤發生的原因是因為PHP默認情況下不信任SSL證書頒發的機構,而在訪問HTTPS協議的網站時,會對SSL證書的合法性進行驗證,如果驗證不通過則返回上述錯誤。
正確的做法是使用CURL庫來獲取HTTPS網頁內容,示例代碼如下:
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://www.baidu.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); $data = curl_exec($ch); $headers = substr($data, 0, curl_getinfo($ch, CURLINFO_HEADER_SIZE)); curl_close($ch); print_r($headers);
在使用CURL庫的時候,需要設置CURLOPT_SSL_VERIFYPEER和CURLOPT_SSL_VERIFYHOST兩個選項,以跳過SSL驗證過程。
除了使用CURL庫來獲取HTTPS網頁內容,還可以通過給openssl.cafile或openssl.capath參數設置證書文件路徑,來讓PHP信任SSL證書頒發的機構,示例代碼如下:
$opts = [ "ssl" =>[ "verify_peer"=>true, "peer_name"=>"www.baidu.com", "cafile"=>"/path/to/ca-bundle.pem" ] ]; $context = stream_context_create($opts); $headers = get_headers("https://www.baidu.com", 1, $context); print_r($headers);
最后,需要注意的是,使用get_headers()函數獲取HTTPS網址的響應頭信息時,需要滿足以下條件:
- PHP版本大于等于5.2.0。
- 需要開啟php_openssl擴展。
- 需要在php.ini或者運行時使用ini_set()函數設置“allow_url_fopen”選項為1。
因為HTTPS協議的特殊性,獲取HTTPS網址的響應頭信息需要滿足一定的條件,否則會產生錯誤。希望本文的描述對各位讀者能夠有所幫助。