首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

自訂 404 錯誤頁面並郵件通知管理員:完整 PHP 實作

     編輯:PHP 綜合知識

功能需求

  • 友善顯示 404 錯誤資訊(含請求 URI、Referrer)
  • 可配置是否發送郵件通知管理員
  • 三種通報等級:0=不通報、1=僅站內連結觸發、2=所有 404 皆通報

Apache 設定

在 .htaccess 或 httpd.conf 加入:

ErrorDocument 404 /404handler.php

完整處理程式(404handler.php)

<?php
// === 設定區 ===
$domain      = 'example.com';           // 不含 www
$docRoot     = 'https://www.example.com'; // 無尾斜線
$fontFace    = 'system-ui, sans-serif';
$fontSize    = '1rem';
$bgColor     = '#ffffff';
$textColor   = '#1a1a1a';
$reportLevel = 2; // 0=關閉 1=站內 2=全部
$emailTo     = 'webmaster@example.com';
// ===============

// 取得請求資訊
$uri    = $_SERVER['REQUEST_URI'] ?? '/';
$referer = $_SERVER['HTTP_REFERER'] ?? '直接輸入/書籤';
$ip      = $_SERVER['REMOTE_ADDR'] ?? 'unknown';

// 輸出 404 頁面
http_response_code(404);
?>
<!DOCTYPE html>
<html lang="zh-Hant"><head>
<meta charset="utf-8">
<title>404 - 頁面不存在</title>
<style>
body{font-family:;font-size:;background:;color:;margin:2rem auto;max-width:600px;line-height:1.6}
h1{color:#c00}
.code{font-family:monospace;background:#f5f5f5;padding:.2em .4em;border-radius:4px}
</style></head><body>
<h1>404 - 對不起,找不到您請求的頁面</h1>
<p>您請求的網址  在本站不存在。</p>
<p>可能的原因:網址拼寫錯誤、頁面已移動或刪除、外部連結失效。</p>
<p><a href=""><-- 返回首頁</a> | <a href="javascript:history.back()">返回上一頁</a></p>
<?php if ($reportLevel !== 0): ?>
<p>系統已自動記錄此錯誤,管理員將盡快處理。</p>
<?php endif; ?>
</body></html>
<?php
// === 郵件通報邏輯 ===
if ($reportLevel !== 0) {
    $shouldSend = ($reportLevel === 2) ||
                  ($reportLevel === 1 && stripos($referer, $domain) !== false);

    if ($shouldSend) {
        $time = date('Y-m-d H:i:s');
        $subject = "【404 錯誤通報】$time - $uri";
        $body = <<

進階擴充建議

  • 去重機制:同一 URI + IP 在短時間內重複 404 僅通報一次(Redis/資料庫記錄)。
  • 結構化日誌:改寫入資料表或 ELK 堆疊,便於儀表板分析。
  • 豐富頁面:加入站內搜尋框、網站地圖連結、熱門頁面推薦,降低跳出率。
  • 非同步發信:將郵件推入佇列(Redis/RabbitMQ),由背景 Worker 發送,避免阻塞回應。

安全性提醒

  • 勿在 404 頁面輸出敏感伺服器資訊(路徑、資料庫錯誤等)。
  • Referrer 標頭可偽造,不可作為信任依據。
  • 郵件標頭注入防護:$subject、$emailTo 需過濾換行符。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved