重定向到HTTP错误文档而不更改请求URL


Redirecting to HTTP error documents without changing the request URL

我试图从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相同。