【问题标题】:Emulate a 403 error page模拟 403 错误页面
【发布时间】:2011-07-01 00:09:10
【问题描述】:

我知道您可以发送一个标头,告诉浏览器该页面被禁止,例如:

header('HTTP/1.0 403 Forbidden');

但是我如何才能显示在服务器上针对此类错误创建的自定义错误页面?

默认情况下,仅发送标题会显示一个白色页面,但我记得前段时间阅读您可以使用客户错误页面。有人知道吗?

【问题讨论】:

    标签: php header http-status-code-403


    【解决方案1】:

    只需在发送标头后回显您的内容。

    header('HTTP/1.0 403 Forbidden');
    
    echo 'You are forbidden!';
    

    【讨论】:

    • 我知道我可以做到,但是如何使用已经设置好的自定义错误模板?
    • @Ryan 完全取决于您的应用程序的设置方式。可能只包括它。不要发送Location 标头,因为它会更改响应代码。
    • 这假定 HTTP/1.1 协议。我们现在有 HTTP/1.1 和 HTTP/2。不要使用这个。
    【解决方案2】:

    http_response_code 是在 PHP 5.4 中引入的,让事情变得更容易了!

    http_response_code(403);
    die('Forbidden');
    

    【讨论】:

      【解决方案3】:

      更改标题后包含自定义错误页面。

      【讨论】:

      • 我也试过了,但是这样的东西没有被渲染:
      • 所以经过更多的搜索并且没有找到任何其他内容后,我选择包含该页面并用 PHP 替换 SSI 命令。
      • Ryan,听起来不错——为了让服务器端包含工作,你必须再次调用 Apache 以某种方式说,“没关系,不要将此请求作为 PHP 服务,服务'this page' 代替” - 或者(在该行为的模拟中)通过请求该 403 页面并将输出作为原始请求的响应发送回来代理您自己的站点。
      【解决方案4】:

      为此,您必须首先向浏览器说明用户收到错误 403。为此,您可以使用以下代码:

      header("HTTP/1.1 403 Forbidden" );
      

      然后,脚本发送“错误,错误,错误,错误,错误......”,所以你必须停止它。你可以使用

      exit;
      

      通过这两行,服务器发送错误并停止脚本。

      不要忘记:模拟错误,但您必须将其设置在 .htaccess 文件中,使用

      ErrorDocument 403 /error403.php
      

      【讨论】:

        【解决方案5】:

        看了很多答案,但正确的是按照php手册提供header函数调用的完整选项

        void header ( string $string [, bool $replace = true [, int $http_response_code ]] )
        

        如果你调用 with

        header('HTTP/1.0 403 Forbidden', true, 403);
        

        将遵循使用 Apache 或任何其他服务器配置的 HTTP 403 的正常行为。

        【讨论】:

          【解决方案6】:

          我已经阅读了这里的所有答案,但没有一个是针对我的情况的完整答案(在这个问题中完全相同),所以这是我收集建议答案的某些部分并提出确切解决方案的方式:

          1. 登陆您服务器的真实 403 页面。 (转到您服务器上的禁止 URL,或转到您喜欢的任何 403 页面)
          2. 右键单击并选择“查看源代码”。选择所有源并将其保存到您域上的文件中,例如:http://domain.com/403.html
          3. 现在转到您真正的禁止页面(或您的 php 某些部分中的禁止情况)示例:http://domain.com/members/this_is_forbidden.php
          4. 之前任何HTML输出或标题下方回显此代码! (即使是空格也会导致 PHP 发送 HTML/TEXT HTTP Header 并且它不起作用) 下面的代码应该是您的第一行

                <?php header('HTTP/1.0 403 Forbidden');
                $contents = file_get_contents('/home/your_account/public_html/domain.com/403.html', TRUE);
                exit($contents);
            

          现在您有了确切的解决方案。我通过 CPANEL 最新访问者进行了检查和验证,它被注册为确切的 403 事件。

          【讨论】:

          • 我可能是错的,但我会说它只是打印 /home/your_account/public_html/domain.com/403.php 的 php。它不执行它。
          • @Pierre-OlivierVares 是的,它不执行但它已经是一个静态文件,你为什么要执行它。如果你还想执行包含的文件,使用 include ("/home/your_account/public_html/domain.com/403.php");而是。
          • 为什么它必然是一个静态文件?您自己(在编辑您的评论之前)写了“.php”作为扩展名,并且 OP 在他的 cmets 中要求 SSI。如果它是一个 .html 文件,当然你可以直接回显它。如果它是一个 .php 文件,则假定它是动态的 - 因此除非您明确需要源代码,否则您不能只回显它。
          • 我无法使用 .htaccess ErrorDocument 并且似乎这是唯一适用于 php 标头函数的解决方案。我建议将标题放在一个函数中,例如function error403() { //@tarik 中的所有代码 } 并在您需要的页面上调用 error403()。
          【解决方案7】:

          .htaccess

          ErrorDocument 403     /403.html
          

          【讨论】:

          • 错字了,(我有 404 和 403.html)
          • 即使是用户更改了header,apache会直接显示错误页面吗?我不知道为什么那行不通,但我只是想知道...
          • @alex,抱歉,这种情况有时会发生
          • 这里的人似乎认为如果您更改标头,则无法让 apache 处理请求:stackoverflow.com/questions/1501094/…
          • @Ibrahim AshShohail 用户如何更改标题?标头由服务器生成。
          【解决方案8】:

          为了尽量减少服务器的职责,让它变得简单:

          .htaccess

          ErrorDocument 403 "Forbidden"
          

          PHP

          header('HTTP/1.0 403 Forbidden');
          
          die(); // or your message: die('Forbidden');
          

          【讨论】:

            【解决方案9】:

            使用 ModRewrite:

            RewriteRule ^403.html$ - [F]

            只需确保在 www 根目录中创建一个名为“403.html”的空白文档,否则您将收到 404 错误而不是 403。

            【讨论】:

            • 嗯,它有点工作。我试过了,但是 REQUEST_URI 变量将被设置为 /403.html 而不是你试图限制的资源。这可能会让用户感到困惑。
            • 好吧,你必须玩它。 ModRewrite 非常强大,它绝对是您问题的解决方案。
            【解决方案10】:

            我了解您的 apache conf 或 .htaccess 中已经定义了 ErrorDocument 的情况,并且希望在通过 php 手动发送 4xx 状态代码时显示这些页面。

            不幸的是,这对于普通方法是不可能的,因为 php 将标头直接发送到用户的浏览器(而不是 Apache Web 服务器),而 ErrorDocument 是从 Apache 生成的 http 状态的显示处理程序。

            【讨论】:

              【解决方案11】:

              发送403后刷新页面:

              <?php 
              header('HTTP/1.0 403 Forbidden');
              ?>
              <html><head>
              <meta http-equiv="refresh" content="0;URL=http://my.error.page">
              </head><body></body></html>
              

              【讨论】:

              • 我不认为这是一个很好的解决方案。如果这是您想要实现的目标,为什么不直接发送位置标头。
              猜你喜欢
              • 2013-09-30
              • 2011-03-20
              • 2012-01-31
              • 1970-01-01
              • 2011-10-24
              • 1970-01-01
              • 1970-01-01
              • 2020-01-21
              • 2019-07-14
              相关资源
              最近更新 更多