現象描述
本地 Windows 環境測試正常,發布至 Windows Server 2012 IIS 後訪問報「500 - 內部服務器錯誤」,瀏覽器無具體錯誤信息,僅顯示通用錯誤頁面。
核心原因
IIS 預設關閉詳細錯誤輸出,PHP 錯誤被吞噬,導致無法定位具體腳本異常(如擴展缺失、權限不足、配置錯誤)。
快速開啟詳細錯誤
- 打開 IIS 管理器,選中站點,雙擊 錯誤頁面 圖標。
- 右側操作欄點擊 編輯功能設置。
- 在「錯誤響應」區域勾選 詳細錯誤,確定保存。
- 重新訪問頁面,此時將顯示 PHP 具體錯誤行號、堆疊跟踪及錯誤類型。
進階排查清單
- PHP 版本與擴展:確認 `php.ini` 已啟用所需擴展(如 `php_mysqli.dll`, `php_pdo_sqlsrv.dll`),且版本與 PHP 主版本匹配(TS/Non-TS、x86/x64)。
- 目錄權限:站點物理路徑需授予 `IIS_IUSRS` 讀取/執行權限;上傳、緩存目錄需寫入權限。
- FastCGI 設置:IIS 中 FastCGI 模組指向正確的 `php-cgi.exe` 路徑,請求超時、實例最大數根據流量調整。
- 錯誤日誌:`php.ini` 設定 `log_errors = On`, `error_log = "C:\php_errors.log"`,定期查看。
- Web.config 重寫規則:若使用 URL Rewrite,確保規則語法正確,避免無限循環導致 500。
常見坑點
開啟詳細錯誤後若顯示「Class 'mysqli' not found」,通常是 `extension_dir` 路徑錯誤或 `php_mysqli.dll` 缺失;若報「Access denied」,檢查匿名用戶身份或應用程序池身份權限。