不能。PHP致命错误发生在Apache读取ErrorDocument前,.htaccess完全不生效;需同时设置php_flag display_errors off、log_errors on及php_value error_reporting 0,并注意PHP-FPM与mod_php配置差异。

Apache 的 ErrorDocument 能否真正隐藏 PHP 错误?
不能。PHP 错误(如 Parse error、Fatal error)在 Apache 读取到 ErrorDocument 指令之前就已发生,此时 PHP 解释器已崩溃或中止执行,.htaccess 中的 ErrorDocument 完全不生效。你看到的“白屏”或原始错误信息,是 PHP 自己输出的,不是 Apache 返回的 500 页面。
php_flag display_errors off 必须配合 php_flag log_errors on
仅关掉 display_errors 不够安全——它只是不让错误显示在页面上,但若 log_errors 也关着,错误就彻底消失,连日志都找不到。生产环境必须成对设置:
php_flag display_errors off php_flag log_errors on php_value error_log /var/log/apache2/php-errors.log
注意:php_value error_log 路径需 Apache 进程有写权限;若用 PHP-FPM,该路径由 FPM pool 配置决定,.htaccess 中此项可能被忽略。
为什么 SetEnvIf + RedirectMatch 拦不住 PHP 致命错误?
这类规则作用于 Apache 请求处理阶段,而 PHP 致命错误发生在响应生成阶段末尾。常见误区是写:
立即学习“PHP免费学习笔记(深入)”;
SetEnvIf Request_URI "\.php$" php_script RedirectMatch 404 ^/.*\.php$
这只能屏蔽 PHP 文件访问,不能拦截已加载并出错的 PHP 脚本。真正有效的前置控制只有:
• 确保所有入口统一走 index.php(前端控制器模式)
• 删除或 chmod -r 所有非入口 PHP 文件
• 在 index.php 开头强制设置 error_reporting(0) 和 ini_set('display_errors', '0')(比 .htaccess 更早生效)
最简且可靠的错误隐藏组合
三件事缺一不可:
-
php_flag display_errors off(禁页面输出) -
php_flag log_errors on(确保错误落地) -
php_value error_reporting 0(覆盖代码中可能的error_reporting(E_ALL))
注意:error_reporting 在 .htaccess 中必须用 php_value,不能用 php_flag;若值为数字(如 30719),需确认与当前 PHP 版本对应,推荐直接写 0 最稳妥。
真正容易被忽略的是:PHP CLI 和 Web SAPI 的配置彼此独立,phpinfo() 输出的 Loaded Configuration File 路径,才是你该去改的地方——.htaccess 只对 Apache mod_php 生效,对 PHP-FPM 几乎无效。











