我试图从PHP页面显示HTTP错误文档,但我希望原始URL保留在地址栏中,以防止搜索引擎抓取工具感到困惑,并允许重新加载页面,以防这是一个临时问题。
我在PHP中创建了一个重定向函数,它是这样的:public static function Redirect($url, $code = '303 See Other') {
header('HTTP/1.1 ' . $code);
header('Location: ' . $url);
exit(0);
}
如果我想显示一个错误文档,例如403 Forbidden,我将执行以下操作:Redirection::Redirect('/errordocs/403.php', '403 Forbidden');
,它将正常工作。
正如我所说的,用户URL将更改为/errordocs/403.php
,这是我想避免的。
我试图做的是删除header('Location: ' . $url);
行,如果HTTP代码是4xx或5xx。我希望这会触发Apache显示正确的文档,因为我有我的。htaccess设置指向相关的错误页面(它工作得很好)。
我实际上从这样做得到的是标准的谷歌Chrome消息,当东西坏了,而不是我漂亮的自定义错误文档。
在一个快速的共识中,现在做这件事的最好方法是什么?让它回显页面而不是重定向?我只是做了同样的事情,但因为它是一个404 -未找到-在我看来-它已经消失了…
我这样设置。htaccess文件
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) - [G]
ErrorDocument 410 /error404.php
现在只要有人点击404,它就会显示漂亮的404页面,但会保持在当前的url
注意:这里是一个工作的例子。htaccess文件:http://www.smdailyjournal.com/stackoverflow
当你去检查标题代码时,你会看到它返回一个真正的410 - Gone消息:)
在4xx状态码的情况下,可以只显示错误html的内容。否则重定向:
public static function Redirect($url, $code = '303 See Other') {
header('HTTP/1.1 ' . $code);
if(strpos($code, '4') === FALSE) {
header('Location: ' . $url);
} else {
include(get_error_page_file_name($code));
}
exit(0);
}
上面的示例将发送正确的HTTP状态码,将显示错误页面的内容,并保持地址中的url相同。