現象:IIS 站點訪問報 HTTP 401.3 / 403,「您不具備查看該目錄或頁面的權限,因為訪問控制列表 (ACL) 對 Web 服務器上的該資源進行了配置」。同服務器 ASP 站點正常,PHP 站點全掛。
根因定位
- IIS 網站綁定的匿名用戶 (IUSR / IIS_IUSRS) 對 **網站目錄** 權限正常 (讀取/執行)。
- 但 PHP 解析器 (`php-cgi.exe`) 所在目錄 (如 `D:\PHP\`) **缺少該匿名用戶的讀取/執行權限**。
- 請求流程:IIS 接收請求 → 轉發給 FastCGI 模組 → FastCGI 嘗試啟動 `php-cgi.exe` → 文件系統 ACL 檢查失敗 → 返回 401.3/403。
解決步驟
- 右鍵 PHP 安裝目錄 (如 `D:\PHP`) → 「屬性」→ 「安全」標籤。
- 點擊「編輯」→ 「添加」→ 輸入對象名稱:IIS_IUSRS (或具體站點應用程式池標識 `IIS AppPool\YourPoolName`) → 「檢查名稱」→ 確定。
- 授予權限:**讀取和執行**、**列出文件夾內容**、**讀取** (勾選即可,無需寫入/修改)。
- 勾選「替換子對象權限條目...」遞歸應用到所有子目錄文件。
- 確定關閉對話框,執行
iisreset 或回收對應應用程式池。
驗證
瀏覽器訪問 PHP 頁面 (如 `phpinfo.php`),正常顯示,不再報 401.3/403。
擴展:應用程式池標識最佳實踐
- 每個站點**獨立應用程式池**,標識使用 **ApplicationPoolIdentity** (虛擬帳戶 `IIS AppPool\PoolName`),自動擁有最小權限。
- 僅需在 PHP 目錄、網站目錄、上傳目錄、Session 存儲目錄授予對應 `IIS AppPool\PoolName` 權限,實現站點間權限隔離。
- 避免使用 `Network Service`、`Local System` 等高權限內建帳戶運行網站。