如果输入错误的动态URL而不更改浏览器中的URL地址,如何显示自定义404错误页面

时间:2015-09-17 07:45:19

标签: php http-status-code-404

我有一个页面" errors.php"其中包含页眉,页脚,侧边栏,装饰精美。在我的.htaccess文件中,我有 - ErrorDocument 404 /errors.php。

现在,如果有人前往不存在的文件或目录,例如www.mywebsite.com/nofile,他看到了漂亮的404错误页面。没关系

问题是 - 我在.htaccess中重写规则,将www.mywebsite.com/view?id=1转换为www.mywbsite.com/view/this-is-seo-url-page。这很好,工作。现在我想要有人输入错误的网址然后向他显示404 /错误,例如www.mywebsite.com/view/this-is-wrong-url

在view.php中,我有这个 -

<?php
include('header.php');
//make a database query and fetch data from tables
//To check write or wrong url, I am doing this
if ($row['friendly_url'] != $_GET['id']) {
    header("HTTP/1.1 404 Not Found");
    include('./errors.php');
    exit();
}
include('sidebar.php);
include('footer.php');

这样工作正常,但由于errors.php也包含header.php文件,我收到头文件已经发送错误。所以我希望解决方案就像我将用户重定向到errors.php页面,但在浏览器地址栏URL中保持与用户输入相同。如果我执行标题(位置...),则浏览器中的URL将更改为新目标。

2 个答案:

答案 0 :(得分:1)

这不会使用PHP解决,而是使用逻辑解决。在将任何输出发送到浏览器之前,您需要从URL确定页面是否正确,然后设置标题并相应地包含正确的文件。

  • 阅读网址
  • 确定网址是否有效
  • 如果有效:
    • 包括( '的header.php');
    • 包含('page.php文件)
    • 包括('的sidebar.php);
    • 包括( 'footer.php');
  • 如果无效
    • 设置404标题
    • 包括( '的header.php');
    • 包含('error.php)
    • 包括('的sidebar.php);
    • 包括( 'footer.php');

此逻辑允许您根据脚本顶部的逻辑决策设置headers()并包含includes() - 保持您的网址相同

在您的示例中,如果您的include('header.php');包含任何输出,那么您的header("HTTP/1.1 404 Not Found");无论如何都会失败,因为您无法在标题之前发送任何输出。

答案 1 :(得分:0)

我的天啊!我用“include_once();”解决了这个问题。

实际上正如我上面在我的问题中所说的那样,我使用过 - include('header.php');在两个文件中,即在view.php和errors.php中。因此,当访问者在view.php中时触发errors.php页面时,两个headers.php发生冲突并导致许多问题,例如已经发送的头,session / db host / db name已经声明为blah .. blah ... < / p>

所以在页面errors.php中,我改变了include('header.php'); to include_once('header.php');.现在当errors.php被触发时,只有一个header.php工作,其他的被忽略,因此一切都很顺利。

有些人可能会想到为什么我不删除“include('header.php');”完全来自errors.php,如果它是冲突的。如果我完全删除这一行,那么假设由于我的根目录中的文件/目录的静态URL错误而触发了404错误,那么我的errors.php将显示给没有标题的访问者,这将破坏页面的其他功能。

希望我的意思很清楚。