HTTP 回應標頭中的 Server 欄位通常包含伺服器軟體名稱與版本(如 Apache/2.4.41 (Ubuntu)、nginx/1.18.0、Microsoft-IIS/10.0)。本文示範如何用 PHP Socket 連線取得此資訊。
<?php
/**
* 偵測遠端 Web Server 類型
* @param string $host 目標主機(域名或 IP)
* @param int $port 連接埠,預設 80
* @param int $timeout 逾時秒數
* @return string|false Server 標頭值或 false
*/
function detectWebServer($host, $port = 80, $timeout = 5) {
$fp = @fsockopen($host, $port, $errno, $errstr, $timeout);
if (!$fp) return false;
// 發送簡單 HEAD 請求
$request = "HEAD / HTTP/1.1\r\nHost: $host\r\nConnection: Close\r\n\r\n";
fwrite($fp, $request);
$server = '';
while (!feof($fp)) {
$line = fgets($fp, 4096);
if (stripos($line, 'Server:') === 0) {
$server = trim(substr($line, 7));
break;
}
}
fclose($fp);
return $server ?: false;
}
// 使用範例
$targets = ['www.google.com', 'www.apache.org', 'www.microsoft.com'];
foreach ($targets as $host) {
$server = detectWebServer($host);
echo "$host => " . ($server ? $server : 'Unknown') . "\n";
}
?>
<?php
function getServerHeader($url) {
$ctx = stream_context_create([
'http' => ['method' => 'HEAD', 'timeout' => 5, 'ignore_errors' => true],
'ssl' => ['verify_peer' => false, 'verify_peer_name' => false]
]);
$headers = @get_headers($url, 1, $ctx);
if (!$headers) return false;
return $headers['Server'] ?? $headers['server'] ?? false;
}
echo getServerHeader('https://www.php.net'); // 例:nginx
?>
Server 標頭(ServerTokens Prod、server_tokens off),僅顯示 Apache 或 nginx,甚至完全移除。nmap -sV:專業服務版本偵測工具。whatweb、wappalyzer:指紋識別框架,綜合 Header、HTML、JS、Cookie 等特徵判斷技術棧。get_headers() 配合 stream_context 為最輕量的內建方案。透過 HTTP Server 標頭偵測伺服器類型簡單易行,但準確度受限於安全配置與代理層。實務上應結合多種指紋特徵綜合判斷,並注意法律與道德邊界。