【问题标题】:How to display default Apache 404 from PHP如何从 PHP 显示默认的 Apache 404
【发布时间】:2017-11-21 03:04:57
【问题描述】:

我环顾四周,没有发现任何关于我需要什么的问题。

我想制作类似“admin.php”的东西,但如果条件不正确,我想制作它返回 404 的地方。然而,一个看起来与其他所有 404 页面不同的 404 将向攻击者暗示“admin.php”是一个真实文件。

我不想制作自己的自定义 404 页面,我认为 Apache 的默认 404 对我来说已经足够了。如何发送 404 触发 apache 发送已经 ErrorDocument。我假设此错误文档在搜索后位于(在 Ubuntu 中):“/usr/share/apache2/error/HTTP_NOT_FOUND.html.var”

当我使用类似的东西时:

<?php
    http_response_code(404);
    die();
?>

在网络浏览器中看起来像这样:

当我请求一个真正不在网络服务器上的 URL 时,它看起来像这样:

我想知道如何使用 Apache 的默认 404 页面使“/admin.php”看起来像第二个图像。有没有办法在不使用 .htaccess 文件的情况下仅从 PHP 中执行此操作?如果没有,那我只需要弄清楚如何弄乱 Apache 设置。

【问题讨论】:

    标签: php apache apache2 ubuntu-14.04


    【解决方案1】:

    完整的php嵌入示例(测试)如下:

    if ( $_SESSION['login_user'] !== "admin" ) {
    
        echo("<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">");
        echo("<html><head>");
        echo("<title>404 Not Found</title>");
        echo("</head><body>");
        echo("<h1>Not Found</h1>");
        echo("<p>The requested URL ".htmlspecialchars($_SERVER['REQUEST_URI'])." was not found on this server.</p>"); 
        echo("<hr>");
        echo("<address>".apache_get_version()." Server at ".$_SERVER['SERVER_ADDR']." Port ".$_SERVER['SERVER_PORT']."</address>");
        echo("</body></html>");
        exit;
            }
    

    【讨论】:

    • 这是不好的做法。您不应回显每一行。 echo 也不需要括号。
    【解决方案2】:

    没有办法仅通过返回 404 来执行此操作,因为 Apache 会找到该文件,因此不会再抛出错误页面。您可以做的最好的事情是模拟 Apache 错误页面:

    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html><head>
    <title>404 Not Found</title>
    </head><body>
    <h1>Not Found</h1>
    <p>The requested URL /<?php echo htmlspecialchars($_SERVER['REQUEST_URI']); ?> was not found on this server.</p>
    </body></html>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-31
      • 2016-03-02
      • 2012-06-17
      • 2012-12-17
      • 1970-01-01
      相关资源
      最近更新 更多