在PHP中触发500内部服务器错误并显示Apache错误页面

Vin*_*Vin 39 php apache

如何在PHP中触发500内部服务器错误404页面未找到 Apache错误?

对于500内部服务器错误,我尝试了以下代码:

header("HTTP/1.0 500 Internal Server Error");
Run Code Online (Sandbox Code Playgroud)

但它显示了一个空白页面.如何以Apache的默认格式显示错误?

请指导..

Ben*_*Lee 16

您可以将Apache错误文档复制到Web根目录中(或将它们符号链接)并用于header()设置错误代码并将这些文档作为输出.这可能是最好的,除非你有令人信服的理由不这样做.但是,如果这对你不起作用,有一些替代品(尽管是hacky替代品).

对于500,只需在代码中添加一个错误.

<?php throw new Exception('Nooooooooooooooo!'); ?>
Run Code Online (Sandbox Code Playgroud)

PHP脚本将引发异常,从而产生常规的Apache 500错误页面.(但请注意,如果将PHP init设置设置display_errors为,这只会导致Apache错误0.在大多数开发配置中,情况并非如此.在大多数生产配置中,情况都是如此.如果你不这样做.知道你的生产服务器的设置,你只需要测试它,看看它是否有效.)

对于404,我认为您可以做的最好的事情是重定向到不存在的页面.它不是完全相同的东西,但可能适用于您的目的.

<?php header("Location: /i-dont-think-therefore-i-am-not"); ?>
Run Code Online (Sandbox Code Playgroud)

在大多数浏览器中,用户实际上看不到重定向,他们只是静默地快速重定向到不存在的页面,导致常规的Apache 404错误.当然,网址会发生变化,有些用户可能会注意到这一点.如果这是不可接受的,您可以使用Apache mod_rewrite将url后端重写为不存在的位置,从而获得类似的结果.

要回复几条注释:通过header()(或其他方式)设置响应代码不会产生标准的Apache错误文档.它只会使用您自己的输出返回响应代码.这是故意行为,旨在使您可以拥有自定义错误文档,或者按照HTTP规范对任何请求的指示设置响应代码.如果您需要Apache错误文档,您必须伪造它们(根据我最初的建议,只是将错误文档复制到您的Web根目录),或者您必须欺骗Apache返回它们(根据我的备份建议) .

  • 致命错误:未捕获的异常'Exception',消息为'Nooooooooooooooo!' (12认同)
  • 一个妥协的解决方案是:创建一个文件夹,并在其中保留一个.htaccess文件,并在htaccess文件中添加以下代码:<IfModule mod_rewrite.c> RewriteEngine On RewriteCond%{REQUEST_FILENAME} -d RewriteRule ^])(.(*/RewriteRule ^])((a-zA </ IfModule>显示错误只是使用header()重定向到该文件夹​​URL.这就是诀窍.谢谢大家 (5认同)
  • 布莱什.真的没有必要这种hackery. (4认同)
  • 我想借此机会重述我原来的评论:Blech.有时需要这种hackery,但仍然,blech;) (3认同)
  • @GordonM在没有任何框架的情况下为我工作. (2认同)

Vin*_*Vin 9

经过这样的知识全面讨论,我认为没有php代码可以默认显示500内部服务器错误.解决方案是:
1 .在php文件旁边创建一个名为http500的文件夹.
2.在其中创建.htaccess文件并添加以下代码:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^])(.(*/
    RewriteRule ^])((a-zA
</IfModule>
Run Code Online (Sandbox Code Playgroud)
  1. PHP重定向代码:

标题('location:http500 /');

  • 在.htaccess中你不需要那些非常hacky的东西,你可以直接触发500:`RewriteRule ^ - [R = 500]`.(事实上​​,任何无效的语法都可以完成这项工作,例如`crash`).您不需要单独的文件夹,您可以在主.htaccess文件中使条件有条件:`RewriteRule ^ crash $ - [R = 500]`并重定向到`/ crash`. (5认同)

Eth*_*one 6

function ISE()
{
  header('HTTP/1.1 500 Internal Server Error', true, 500);
  trigger_error('ISE function called.', E_USER_ERROR);//if you are logging errors?
}
Run Code Online (Sandbox Code Playgroud)

但是,header()在使用任何输出函数之后,您将需要输出缓冲ON才能使用php 函数echo.


Alp*_*33k 6

我知道这是一个旧线程但是......

您可以将 iframe 元素渲染到视图中,然后在您准备处理错误时将其高度和宽度设置为 100%。

<?php header("HTTP/1.0 500 Internal Server Error"); http_response_code(500); ?>

<iframe src="page_displaying_apache_screenshot_fullscreen.html"></iframe>

这就是说

我确实认为最好的现代解决方案是这样的:

<?php
header("HTTP/1.0 500 Internal Server Error");
http_response_code(500);
?>
<div class="panel-body">
    <h1>Error!</h1>
     <p>
         <?php

         // Then, in the view if your in dev env, print exception and stack trace
         if ($env === 'dev') 
         {
             throw new Exception('Uh oh! Something broke while adding a new user the db.');
         }
         else 
         {
             echo "Hold your butts, an error has occured.";
             die();
         }
         ?>
     </p>
   </div>
Run Code Online (Sandbox Code Playgroud)

如果您在开发堆栈上将 $env 变量设置为“dev”,这将为所有用户生成正确的错误代码,并且还会为开发人员生成堆栈跟踪。 默认情况下使用 CENTOS7 使用 yum 安装的 PHP 5.4,用户会看到什么

没有重定向,没有黑客攻击,安全,除非您需要暴露错误,但它不会。:)