開始前準備
本篇適合進階使用者. 以 aaPanel 8.0.6 繁體中文介面核對, 若仍為英文, 請先完成 切換繁體中文.
適用於 Nginx 網站的測試檔案區或管理資料夾. 正式使用帳密驗證前請先完成 HTTPS. 備份網站設定, 保留可用的面板與 SSH 連線, 不要一開始就限制整個網站根路徑.
這個版本的 限制訪問 可設定資料夾帳密; 拒絕訪問 是路徑與副檔名限制, 不是 IP 白名單. IP 白名單需要調整 Nginx 設定. 本篇先對 /private-demo/ 示範, 不套用到其他路徑.
01建立資料夾帳密保護
先在網站根目錄建立 private-demo 資料夾與一個可辨識的測試首頁. 進入 網站 > PHP項目 > Conf > 限制訪問, 保持 限制訪問 分頁, 點 添加限制訪問.
名稱 填 tutorial_private, 路徑 填 /private-demo/, 再設定專用 使用者名稱 與 密碼, 按 確定. 路徑是網站 URL 路徑, 不是硬碟的完整路徑. 這組帳密與 aaPanel 或 WordPress 帳密分開.
放大圖片
02先驗證帳密, 再處理存取錯誤
以未登入的無痕視窗訪問該目錄, 應要求帳密, 未提供正確帳密時回傳 401. 輸入正確帳密後才應看到測試內容. 另測試目錄內的圖片與子路徑, 確認沒有繞過保護.
若輸入正確密碼後反而回傳 500, 查看 錯誤日誌. 本次遇到驗證檔無法被網站服務讀取, 修正後才能登入. 只有當日誌明確指出該檔 Permission denied, 且已確認 Nginx 以 www 群組執行時, 才依下例修正指定路徑. 將 YOUR_SITE 改成實際站點目錄名稱, 不要改成全員可讀寫的 777.
chgrp www /www/server/pass /www/server/pass/YOUR_SITE \
/www/server/pass/YOUR_SITE/tutorial_private.pass
chmod 750 /www/server/pass /www/server/pass/YOUR_SITE
chmod 640 /www/server/pass/YOUR_SITE/tutorial_private.pass
放大圖片
03在同一規則加入 IP 白名單
先保存設定副本. 在 文件 找到這個規則的 Nginx 檔案 /www/server/panel/vhost/nginx/dir_auth/YOUR_SITE/tutorial_private.conf, 以文字編輯器開啟. 在既有 location 的大括號內加入以下三行, 保留原本的 auth_basic, auth_basic_user_file 與其他設定, 不另建重複 location.
satisfy all;
allow 203.0.113.10;
deny all;203.0.113.10 只是文件範例, 儲存前必須改成你要允許的實際公開來源 IP. 多個來源可逐行加入 allow, 最後才放 deny all. satisfy all 表示 IP 與帳密兩項都要通過. 使用 CDN 或其他代理時, 先確認 Nginx 看到的來源 IP 與可信任代理設定, 不要直接信任任意請求標頭.
按 保存 後在 SSH 檢查設定; 只有語法檢查成功才重新載入. 若失敗, 先復原這次修改. 日後透過面板修改同一規則, 需再次確認手動加入的限制是否仍存在.
/www/server/nginx/sbin/nginx -t && \
/www/server/nginx/sbin/nginx -s reload
放大圖片
04分別測試允許與拒絕來源
| 來源與帳密 | 預期結果 |
|---|---|
| 白名單 IP, 未提供帳密 | 401, 仍需登入. |
| 白名單 IP, 正確帳密 | 200, 可讀取預期內容. |
| 非白名單 IP | 403, 即使知道密碼也不能通過 IP 限制. |
本次已分別驗證以上三種結果. 測試首頁, 子目錄與不同檔案類型, 並確認其他網站路徑未受影響. 若把自己擋在外面, 使用保留的 SSH 或面板連線復原設定副本, 不要停用整台主機的防火牆來處理目錄規則.
放大圖片