在不更改请求URL的情况下重定向到HTTP错误文档

时间:2012-12-22 22:01:40

标签: php http-headers http-status-codes

我正在尝试从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');它会正常工作。

正如我所说,用户网址将更改为我想避免的/errordocs/403.php

如果HTTP代码是4xx或5xx,我尝试做的是删除header('Location: ' . $url);行。我希望这会触发Apache显示正确的文档,因为我将.htaccess设置为指向相关的错误页面(它可以正常工作)。

我实际上从实际操作中获得的是标准的Google Chrome消息,当时内容出现故障而非我的漂亮自定义错误文档。

快速达成共识,现在最好的方法是什么?让它回显页面而不是重定向?

2 个答案:

答案 0 :(得分:2)

我刚刚做了同样的事情,但因为它是404 - 没有找到 - 在我看来 - 它已经消失......

所以我像这样设置我的.htaccess文件:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) - [G]
ErrorDocument 410 /error404.php

现在,只要有人点击404,它就会显示漂亮的404页面,但会保留在当前网址上

注意:这是.htacesss文件的一个工作示例: http://www.smdailyjournal.com/stackoverflow

当你去Check the Header Codes时,你会看到它返回一个真正的410消息:)

答案 1 :(得分:1)

如果是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在地址中保持不变。