除了使用阿裡雲站點監控服務以外,我們也一直在使用PHP編寫的巡檢程序定期檢查各個系列的各個站點,最近發現有一些異常報錯,主要有兩種情況:
1、SSL證書驗證不通過
會導緻程序反複重試,十一期間就不斷報錯,在網上查到是Let's Encrypt的SSL證書有些問題,雖然普通浏覽者沒有影響,但我們Linux服務器上的PHP和wget都不行,可以采取跳過SSL證書驗證的辦法來臨時解決,wget使用wget --no-check-certificate的參數來運行,而PHP程序中添加下面一段:
stream_context_set_default( [ 'ssl' => [ 'verify_host' => false, 'verify_peer' => false, 'verify_peer_name' => false, ], ]);
再用get_headers和file_get_contents就可以訪問https的站點了。
2、無User Agent被屏蔽
我們以前在apache htaccess中設置過無User Agent的訪問被拒絕,或者在PHP反采集程序中加同樣的判斷和措施,還有CDN中也可以設置防火牆來屏蔽。
這些天我們運行多年的巡檢程序也遇到這種情況而報錯,可以這樣設置:
$opts = [ "http" => [ "method" => "GET", "header" => "Accept-language: en\r\n" . "Cookie: foo=bar\r\n" . "User-Agent: Linux W-Get Monitor2 Main.php opts\r\n" ] ]; $context = stream_context_create($opts); $content = file_get_contents($url, false, $context);
而更簡單的辦法是這樣:
ini_set('user_agent', 'Linux W-Get Monitor2 Main.php set');
對file_get_contents和get_headers都有效。
评论