如何使用 PHP 处理 403 错误

Posted

技术标签:

【中文标题】如何使用 PHP 处理 403 错误【英文标题】:how to handle a 403 error with PHP 【发布时间】:2012-08-06 07:40:42 【问题描述】:

我已经构建了一个 php 脚本,由于通过 $_POST 方法发送的数据的长度和内容,有时可以让服务器返回 403 错误消息(禁止访问)。由于某些 mod_secure 规则过滤了服务器上发送的数据,因此返回此 403 错误消息。

是否可以让 PHP 处理这个 403 错误消息? 例如,我会在运行脚本时捕获服务器状态,然后在服务器返回 403 状态代码时显示错误消息。 甚至可以在 PHP 中做到这一点吗?

换句话说,如果不进行重定向,我只想在当前页面中显示一条自定义消息,如果服务器在执行 PHP 脚本本身时返回 403 状态代码。

感谢您的帮助

【问题讨论】:

你的意思是,你想自定义错误页面?如果是,则可以使用 .httaccess 重定向方法。在 .htaccess 文件中添加 ErrorDocument 403 /forbidden.php 并保存。 并非如此。在不进行重定向的情况下,如果服务器在执行 PHP 脚本本身时返回 403 状态代码,我只想在当前页面中显示一条自定义消息。谢谢 【参考方案1】:

这将是为 Apache 中的 403 错误设置一个自定义错误文档,并将其指向一个脚本来处理错误。请参阅ErrorDocument 文档了解如何执行此操作,但大致如下:

ErrorDocument 403 /custom_403_handler.php

【讨论】:

如果不进行重定向,我只想在当前页面中显示一条自定义消息,如果服务器在执行 PHP 脚本本身时返回 403 状态码。谢谢 这是一篇很长的文章。基本上,它是一个包含 html 数据的 json 字符串。在一些激活了 mod_secure 的服务器上,字符串包含 html 的简单事实导致与 mode_secure 规则之一发生冲突,然后服务器返回 403 禁止访问页面。此外,数据是通过 jQuery ajax 调用发送的,因此如果服务器返回 403 错误,则用户认为 ajax 调用正在永远加载,而只是服务器不返回任何内容。从那里,我要么用 PHP 检查服务器返回的状态码,要么检查 mod_secure 是否被激活。 我不确定您的要求,但您可以使用 cURL php.net/manual/en/book.curl.php【参考方案2】:

所以我为您提供了三种可能的解决方案。

    检查 URL 错误并确保指定了实际网页。当 URL 指向目录而不是网页时,网站返回 403 Forbidden 错误的常见原因。这可以使用 PHP 中的 HttpRequest 类来完成。您可以使用http_get 来执行 GET 请求。你也可以Test URL here。

    <?php
    $response = http_get("URL", array("timeout"=>1), $info);
    print_r($info);
    ?>
    

    输出:

    array (
       'effective_url' => 'URL',
       'response_code' => 403,
       .
       and so on
       )
    

    对您来说重要的是 response_code,您可以使用它进一步发挥作用。

    卷曲的使用。

    function http_response($url)
     
        $ch = curl_init(); 
        curl_setopt($ch, CURLOPT_URL, $url); 
        curl_setopt($ch, CURLOPT_HEADER, TRUE); 
        curl_setopt($ch, CURLOPT_NOBODY, TRUE); 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
        $head = curl_exec($ch); 
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
        curl_close($ch); 
    
        if(!$head) 
          
         return FALSE; 
         
    
        return $httpCode;
    
    
    $errorcode = http_response("URL");    //if success 200 otherwise different
    

    如果您确定您尝试访问的页面是正确的,则 403 Forbidden 错误消息可能是错误的。然后,您只能做两件事,要么联系网站管理员,要么使用您自己的自定义重定向。为此,在 .htaccess 文件中添加以下行并在禁止的.php 中处理该错误

    ErrorDocument 403 /forbidden.php   
    

【讨论】:

@Nate http_get() 函数是PECL extension 的一部分,您必须明确install。

以上是关于如何使用 PHP 处理 403 错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 nginx、PHP-FPM 和 docker 处理 PHP 文件时出现 403 错误

如何修复错误 403 错误 php 文件

PHP Curl出现403错误怎么办

如何使用 Spring Security 3.0.x 处理 HTTP 403

打开 RewriteEngine 会产生 403 错误——如何打开 FollowSymLinks?

十月CMS 401、402、403、503、400错误代码处理