如何在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返回它们(根据我的备份建议) .
经过这样的知识全面讨论,我认为没有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)
标题('location:http500 /');
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
.
我知道这是一个旧线程但是......
您可以将 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”,这将为所有用户生成正确的错误代码,并且还会为开发人员生成堆栈跟踪。
没有重定向,没有黑客攻击,安全,除非您需要暴露错误,但它不会。:)