为了包含正确的文件并在发生错误时显示错误页面,我有以下代码(非常简化):
$page = 'examplePage.php';
$page404 = '404.php';
if (file_exists($page))
{
require($page);
}
else if (file_exists($page404))
{
require($page404);
}
else
{
// Tell the browser to display his default page
}
?>
总结:
如果我有这个文件,我会把它包括在内。
如果我没有该文件,我会包含错误文件。
如果错误文件也不存在怎么办?
我希望将其呈现为浏览器的默认错误页面。
我已经通过发送带有HTTP错误的空内容在Internet Explorer中实现了这一点。 问题是其他浏览器的行为不一样,它们都显示空白页。
有没有办法告诉浏览器显示自己的错误页面? (不仅是404,而是所有错误:304,500等)
谢谢。
修改:我忘了告诉您我完全控制了我发送的标题以及回复发送的内容。
编辑2:这里有一些代码
// possible paths to retrieve the file
$possiblePaths = array(
$urlPath,
D_ROOT.$urlPath,
D_PAGES.$urlPath.'.php',
D_PAGES.$urlPath.'/index.php',
$urlPath.'.php'
);
foreach ($possiblePaths as $possiblePath)
if (file_exists($possiblePath) && !is_dir($possiblePath))
{
if (!is_readable($possiblePath))
{
Response::setCode(403); // calls the header(403)
self::$filePath = self::getErrorPage(403);
}
else
self::$filePath = $possiblePath;
break;
}
if (self::$filePath === null) // no file found => 404
{
Response::setCode(404); // call the header(404)
self::$filePath = self::getErrorPage(404);
}
public static function _getErrorPage($code)
{
if (is_readable(D_ERRORS.$code.'.php')) // D_ERRORS is the error directory, it contains files like 404.php, 403.php etc
return D_ERRORS.$code.'.php';
else
{
/*-------------------------------------------------*/
/* Here i go if the error file is not found either */
/*-------------------------------------------------*/
if ($code >= 400)
Response::$dieResponse = true; // removes all output, only leaves the http header
return null;
}
}
?>
这是我打印内容的时候:
<?php
if (self::$dieResponse)
{
self::$headers = array(); // no more headers
self::$content = ''; // no more response
}
http_response_code(self::$code); // HTTP code
foreach (self::$headers as $key => $value)
header($key.': '.implode(';', $value)); // sends all headers
echo self::$content;
?>
编辑:这里有一些截图可以解释我想要的内容。
这就是我在IE中所得到的:
这正是我想要的。
现在,在所有其他浏览器中,我都有空白页。 我不想要一个空白页。
我希望,例如,Chrome可以显示:
答案 0 :(得分:0)
如果内容为空,则Web浏览器会显示默认错误页面,例如。创建一个空的PHP文件(error.php)并将其放入:
<?php
$status = http_response_code();
switch ($status) {
case 404:
case 500:
exit;//terminate script execution
break;
...
}
在.htaccess中:
ErrorDocument 400 /error.php
ErrorDocument 500 /error.php
使用HTTP状态
您可以使用http_response_code()
获取GET当前的HTTP状态,.htaccess文件内容:
ErrorDocument 400 /error.php
ErrorDocument 401 /error.php
ErrorDocument 403 /error.php
ErrorDocument 404 /error.php
ErrorDocument 500 /error.php
ErrorDocument 503 /error.php
页面error.php:
<?php
$status = http_response_code();
switch ($status) {
case '400':
echo 'Custom error 400';
break;
case '404':
echo 'Custom error 404';
break;
...
}
使用GET参数
ErrorDocument 400 /error.php?status=400
ErrorDocument 401 /error.php?status=401
ErrorDocument 403 /error.php?status=403
ErrorDocument 404 /error.php?status=404
ErrorDocument 500 /error.php?status=500
ErrorDocument 503 /error.php?status=503
页面error.php:
<?php
$status = empty($_GET['status']) ? NULL : $_GET['status'];
switch ($status) {
case '400':
echo 'Custom error 400';
break;
case '404':
echo 'Custom error 404';
break;
...
}
答案 1 :(得分:0)
前一段时间我问了类似的问题 Access apache errordocument directive from PHP
Upshot要么将用户重定向到通用404页面(以便地址更改)Header("Location: $uri_404");
,要么卷曲自己的404页面并回复它,如下所示:
Header('Status: 404 Not Found');
$uri_404 = 'http://'
. $_SERVER['HTTP_HOST']
. ($_SERVER['HTTP_PORT'] ? (':' . $_SERVER['HTTP_PORT']) : '')
. '/was-nowhere-to-be-seen';
$curl_req = curl_init($uri);
curl_setopt($curl_req, CURLOPT_MUTE, true);
$body = curl_exec($curl_req);
print $body;
curl_close($curl_req);
代码归功于@RoUS
答案 2 :(得分:-1)
如果您需要在任何输出之前显示其默认的404页面,请执行以下操作:
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
见这里:http://www.php.net/manual/en/function.header.php
因此,对于您的代码,您可以将其修改为:
$page = 'examplePage.php';
$page404 = '404.php';
if (file_exists($page))
{
require($page);
}
else if (file_exists($page404))
{
require($page404);
}
else
{
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
}
?>
请注意以下警告:任何其他输出之前必须完成header
内容:
请记住,在任何实际输出之前必须调用header() 通过普通HTML标记,文件中的空行或PHP发送。 使用include或require读取代码是一个非常常见的错误, 函数或其他文件访问函数,并且有空格或空 调用header()之前输出的行。一样的问题 使用单个PHP / HTML文件时存在。
答案 3 :(得分:-1)
也许你可以试试:
header('HTTP/1.0 404 Not Found');