網站原本正常,卻突然顯示 500 Internal Server Error,代表伺服器收到請求後,執行過程發生錯誤,但沒有把真正的錯誤原因顯示在瀏覽器上。
500 錯誤不一定代表主機壞掉,也不一定要立刻重做網站。常見原因包括 PHP 程式錯誤、PHP 版本不相容、檔案權限錯誤、.htaccess 規則異常、PHP-FPM 故障,或資料庫連線失敗。
先提醒:不要只是不斷重新整理,也不要一看到 500 就直接重裝主機。先查看錯誤紀錄,通常能更快找到真正原因。
500 Internal Server Error 常見症狀
- 整個網站所有頁面都出現 500 錯誤。
- 只有某一個功能、表單或後台頁面出錯。
- 網站搬家或升級 PHP 後才開始發生。
- 修改 .htaccess 後網站立即無法開啟。
- 網站偶爾正常、偶爾出現 500 或 503。
- 前台正常,但 AJAX、API 或 DataTables 顯示錯誤。
不同症狀代表的排查方向不同。若整站都無法開啟,應先檢查主機服務、PHP-FPM、.htaccess 與 PHP 版本;若只有單一功能出錯,通常更接近程式或資料庫問題。
1)先查看真正的錯誤紀錄
瀏覽器顯示的 500 只是結果,真正的原因通常會寫在 Apache、Nginx、LiteSpeed 或 PHP 的錯誤紀錄中。
一般 Linux 主機可先查看:
tail -100 /var/log/httpd/error_log
tail -100 /var/log/apache2/error.log
tail -100 /var/log/nginx/error.log
cPanel/WHM 主機常見紀錄位置:
tail -100 /usr/local/apache/logs/error_log
網站帳號自己的 PHP 錯誤紀錄,也可能位於:
/home/帳號/logs/
/home/帳號/public_html/error_log
aaPanel、1Panel 或自行安裝的 PHP-FPM,則要查看對應 PHP 版本的錯誤紀錄及 PHP-FPM 服務紀錄。
常見關鍵字包括:
PHP Fatal errorUncaught ErrorAllowed memory size exhaustedPermission deniedPrimary script unknownCall to undefined functionClass not foundSQLSTATE
重點:排查 500 錯誤時,錯誤紀錄的時間必須和你實際測試網站的時間接近,否則很容易看到舊錯誤而判斷錯方向。
2)檢查最近是否修改過程式
如果網站是在更新程式、安裝套件或修改設定後出現 500,應先確認最近變更過哪些檔案。
- 是否少了分號、括號或引號。
- 是否引用不存在的 PHP 檔案。
- 是否修改資料庫帳號或密碼。
- 是否新增伺服器上不存在的 PHP 函式。
- 是否上傳了不完整的程式版本。
- 是否在正式站直接覆蓋檔案,卻沒有備份。
可先執行 PHP 語法檢查:
php -l index.php
檢查整個專案時,可以針對最近修改的 PHP 檔案逐一執行。若主機有多個 PHP 版本,也要使用網站實際使用的 PHP 執行檔,不要只使用系統預設的 php。
3)確認 PHP 版本是否相容
網站搬家後出現 500,常見原因之一是新舊主機的 PHP 版本不同。
例如舊網站原本使用 PHP 5.6 或 PHP 7.2,新主機卻直接切換到 PHP 8.1 或 PHP 8.2,舊程式可能會因為已移除的函式、語法限制或套件不相容而失敗。
常見情況包括:
mysql_connect()在新版 PHP 已無法使用。- 舊版程式使用已移除的函式。
- 函式參數數量在新版 PHP 中變得更嚴格。
- 舊套件不支援 PHP 8。
- PHP 擴充模組沒有安裝,例如 mysqli、pdo_mysql、mbstring、curl。
可建立暫時測試檔確認版本:
<?php
echo PHP_VERSION;
確認完成後應刪除測試檔,避免公開過多主機資訊。
4)檢查 .htaccess 是否有錯誤
Apache 或 LiteSpeed 網站若使用錯誤的 .htaccess 指令,可能直接造成整站 500。
可先暫時將檔案改名:
.htaccess
改成:
.htaccess_backup
再重新測試網站。如果改名後網站恢復,代表問題可能出在:
- RewriteRule 或 RewriteCond 語法錯誤。
- 使用主機不支援的 Apache 指令。
- 重複設定 PHP Handler。
- 舊主機的 Rewrite 設定搬到新環境後不相容。
- HTTP 與 HTTPS 轉址條件互相衝突。
但要注意,直接停用 .htaccess 可能讓網址改寫失效,因此這個動作主要用來確認問題來源,不代表可以永久刪除。
5)確認檔案與目錄權限
檔案權限太寬或太嚴,都可能造成 500、403 或 PHP 無法執行。
一般網站常見設定為:
- 目錄:
755 - 一般檔案:
644 - 需要寫入的目錄:依主機 PHP 執行模式調整
不建議為了解決問題,直接把整個網站改成 777。這可能暫時掩蓋權限問題,卻增加網站遭竄改或植入惡意檔案的風險。
也要確認檔案擁有者是否正確。網站從 root 帳號解壓縮或搬移後,檔案可能變成 root 所有,導致網站帳號無法讀寫。
6)檢查 PHP-FPM 或網站服務
如果網站不是固定出錯,而是偶爾出現 500、502 或 503,可能與 PHP-FPM 程序、記憶體或最大子程序數量有關。
可查看 PHP-FPM 狀態:
systemctl status php-fpm
不同主機的服務名稱可能不同,例如:
systemctl status php72-php-fpm
systemctl status php74-php-fpm
systemctl status php81-php-fpm
常見原因包括:
- PHP-FPM 程序停止。
- 記憶體不足,被系統終止。
pm.max_children設定太低。- 程式執行時間過長。
- 大量爬蟲或惡意請求占滿程序。
- 資料庫查詢卡住,造成 PHP 程序堆積。
不要只是不斷重啟 PHP-FPM。重啟後短暫恢復,通常代表問題尚未真正解決,還要繼續查看程序數、記憶體與網站存取紀錄。
7)檢查 PHP 記憶體限制
如果錯誤紀錄出現:
Allowed memory size exhausted
代表 PHP 執行時使用的記憶體超過 memory_limit。
這可能是設定太低,也可能是程式一次讀取太多資料、處理過大圖片、產生大型報表,或發生無限迴圈。
只提高 memory_limit 不一定是正確解法。應先確認是哪一段程式消耗記憶體,再判斷要調整限制、分批處理資料,還是修正程式邏輯。
8)確認資料庫連線是否正常
有些網站在資料庫連線失敗時,不會顯示清楚的資料庫錯誤,而是直接回傳 500。
應確認:
- 資料庫主機名稱是否正確。
- 資料庫帳號與密碼是否正確。
- 資料庫使用者是否有權限。
- MySQL 或 MariaDB 是否正在執行。
- 資料庫連線數是否已滿。
- 搬家後資料表是否完整匯入。
- 新版 MySQL 的 SQL Mode 是否影響舊程式。
查看資料庫服務:
systemctl status mariadb
systemctl status mysql
如果錯誤只發生在新增、修改或結帳功能,也要留意欄位沒有預設值、欄位型態不相容,以及 Strict Mode 所造成的寫入錯誤。
9)只有 AJAX 或 DataTables 出錯怎麼辦?
前台頁面正常,但 DataTables 顯示 Invalid JSON response,不一定是 DataTables 本身故障。
常見情況是後端 PHP 原本應回傳 JSON,卻混入:
- PHP Notice 或 Warning。
- session_start 重複執行提示。
- 資料庫錯誤訊息。
- HTML 錯誤頁面。
- 登入逾時後的重新導向內容。
可先打開瀏覽器開發者工具,查看 Network 中該 AJAX 請求的 Response,通常可以直接看到真正的 PHP 錯誤。
建議的排查順序
- 記錄錯誤發生時間與網址。
- 查看 Apache、Nginx、LiteSpeed 或 PHP 錯誤紀錄。
- 確認最近是否修改程式、PHP 版本或主機設定。
- 暫時排除 .htaccess 問題。
- 檢查檔案權限與擁有者。
- 檢查 PHP-FPM、記憶體與程序數量。
- 確認資料庫服務與連線設定。
- 修正後重新測試,並確認錯誤紀錄沒有持續產生新錯誤。
遇到 500 錯誤時,不建議直接做的事
- 不要直接刪除整個網站重新上傳。
- 不要把所有檔案權限改成 777。
- 不要在沒有備份的情況下升級 PHP。
- 不要只靠重啟主機解決問題。
- 不要把完整錯誤訊息、資料庫密碼或 API 金鑰公開貼到網路。
- 不要在正式站反覆修改,卻沒有留下變更紀錄。
結論:500 Internal Server Error 只是表面訊息,真正原因通常已經寫在錯誤紀錄裡。正確做法是先確認錯誤時間、查看 log,再依序檢查程式、PHP 版本、.htaccess、權限、PHP-FPM 與資料庫。
守站人可協助處理 cPanel、aaPanel、1Panel 與一般 Linux 主機上的網站 500 錯誤、PHP 異常、網站搬家與舊系統接手問題。