許多網站會檢查 HTTP 請求的 User-Agent 標頭,若發現非主流瀏覽器特徵(如 PHP 預設的 file_get_contents 不發送 UA),便會拒絕回傳內容或導向驗證頁。本文說明如何在 PHP 中偽造 User-Agent,讓 file_get_contents 或串流操作能順利取得目標頁面。
User-Agent(UA)是 HTTP 請求標頭中的一個字串,包含作業系統、CPU 架構、瀏覽器類型與版本、渲染引擎、語言偏好等資訊。伺服器依此判斷客戶端身分,決定回傳桌面版、行動版或封鎖請求。
ini_set('user_agent', 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; 4399Box.560; .NET4.0C; .NET4.0E)');
此行程式碼需在呼叫 file_get_contents 之前執行。範例模擬 IE8 環境,實務上可替換為 Chrome、Firefox、行動裝置等常見 UA 字串。
若需同時設定 Host、Accept-Language、Accept 等標頭,建議使用 stream_context_create:
<?php
$opts = array(
'http' => array(
'method' => "GET",
'header' => "Host: zh.wikipedia.org\r\n" .
"Accept-language: zh-cn\r\n" .
"User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; 4399Box.560; .NET4.0C; .NET4.0E)\r\n" .
"Accept: */*\r\n"
)
);
$context = stream_context_create($opts);
$content = file_get_contents('https://zh.wikipedia.org/', false, $context);
echo $content;
?>
注意事項:
\r\n 分隔,單純換行符可能導致請求失效。Referer、Cookie 甚至 Accept-Encoding,視情況補充。openssl 擴充功能。| 環境 | User-Agent 範例 |
|---|---|
| Chrome 120 (Windows 10) | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 |
| Firefox 121 (macOS) | Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:121.0) Gecko/20100101 Firefox/121.0 |
| iPhone Safari (iOS 17) | Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1 |
| Googlebot | Mozilla/5.0 (compatible; Googlebot/2.1; +https://www.google.com/bot.html) |
若需處理 Cookie、重導向、POST 資料、Proxy 等複雜情境,建議改用 cURL 擴充功能:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, $ua);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
$html = curl_exec($ch);
curl_close($ch);