核心判斷依據:$_SERVER 關鍵變數
| 伺服器 | 特徵變數 | 典型值 |
| Apache | SERVER_SOFTWARE | Apache/2.4.41 (Ubuntu) |
| Nginx | SERVER_SOFTWARE | nginx/1.18.0 |
| IIS (FastCGI) | SERVER_SOFTWARE | Microsoft-IIS/10.0 |
| IIS (ISAPI/舊版) | HTTP_X_REWRITE_URL | 存在即為 IIS |
| IIS 5.0 CGI | ORIG_PATH_INFO | 存在即為 IIS 5.0 CGI 模式 |
通用偵測函式
/**
* 偵測 Web 伺服器類型
* @return string 'apache' | 'nginx' | 'iis' | 'builtin' | 'unknown'
*/
function detectServer(): string {
$software = $_SERVER['SERVER_SOFTWARE'] ?? '';
if (stripos($software, 'apache') !== false) return 'apache';
if (stripos($software, 'nginx') !== false) return 'nginx';
if (stripos($software, 'iis') !== false || stripos($software, 'microsoft-iis') !== false) return 'iis';
// 缺少 SERVER_SOFTWARE 時的備用判斷
if (isset($_SERVER['HTTP_X_REWRITE_URL'])) return 'iis'; // IIS URL Rewrite 模組
if (isset($_SERVER['ORIG_PATH_INFO'])) return 'iis'; // IIS 5.0 CGI
if (isset($_SERVER['IIS_WasUrlRewritten'])) return 'iis'; // IIS 7+ URL Rewrite
if (php_sapi_name() === 'cli-server') return 'builtin'; // PHP 內建開發伺服器
return 'unknown';
}
實際應用場景
- URL 重寫規則產生:Apache 用
.htaccess,Nginx 用 location 指令,IIS 用 web.config。
- 路徑分隔符處理:Windows/IIS 可能需注意反斜線,但 PHP 內部統一支援正斜線。
- 權限與檔案系統:IIS 常以
IUSR、ApplicationPoolIdentity 執行,需對應設定資料夾權限。
- 標頭大小寫差異:Apache/Nginx 將 HTTP 標頭轉為
HTTP_* 大寫,IIS 行為一致,但自訂標頭前綴可能不同。
進階:偵測 PHP 執行模式(SAPI)
echo php_sapi_name();
// 可能值:apache2handler, fpm-fcgi, cgi-fcgi, cli, cli-server, embed, litespeed
| SAPI | 典型環境 |
| apache2handler | Apache mod_php |
| fpm-fcgi | Nginx/Apache + PHP-FPM(現代主流) |
| cgi-fcgi | 舊版 CGI/FastCGI(IIS 常見) |
| cli | 命令列腳本 |
| cli-server | PHP 內建開發伺服器 (php -S) |
| litespeed | OpenLiteSpeed/LiteSpeed |
結語
透過 $_SERVER['SERVER_SOFTWARE'] 為主、HTTP_X_REWRITE_URL/ORIG_PATH_INFO 為輔,配合 php_sapi_name() 判斷執行模式,即可可靠識別 Apache、Nginx、IIS 等主流環境。現代專案多採用 Nginx + PHP-FPM,但維護舊系統時仍需處理 IIS 特有行為。