使用漂亮的网址将用户重定向到404页面

时间:2017-11-15 22:58:19

标签: php .htaccess url methods http-status-code-404

我正在开展一个mvc项目,只是为了好玩。 漂亮的网址已经可以使用了,但是我无法通过我的代码找到一个很好的方式将访问者发送到404页面,以防页面不存在,人们正在寻找。

class Route
{
       private $_uri = array();
       private $_method = array();

    /*
     * Builds a collection of internal URL's to look for
     * @param type $uri
     */
    public function add($uri, $method = null)
    {
        $this->_uri[] = '/' . trim($uri, '/');

        if($method != null){
            $this->_method[] = $method;
        }
    }

    public function submit()
    {

        $uriGetParam = isset($_GET['uri']) ? '/' . $_GET['uri'] : '/';

        foreach($this->_uri as $key => $value){
            if(preg_match("#^$value$#",$uriGetParam)){
                if(is_string($this->_method[$key])){
                    $useMethod = $this->_method[$key];
                    new $useMethod();
                }
                else{
                    call_user_func($this->_method[$key]);
                }
            }
        }
    }

}

1 个答案:

答案 0 :(得分:0)

我没有彻底分析你的代码(我不能,不知道你添加的示例路由/方法是什么 - > add),但解决方案对我来说似乎很简单:

public function submit()
{

    $uriGetParam = isset($_GET['uri']) ? '/' . $_GET['uri'] : '/';
    $routeFound = false;
    foreach($this->_uri as $key => $value){
        if(preg_match("#^$value$#",$uriGetParam)){
            if(is_string($this->_method[$key])){
                $routeFound = true; 
                $useMethod = $this->_method[$key];
                new $useMethod();
            }
            else{
                $routeFound = true; 
                call_user_func($this->_method[$key]);
            }
        }
    }
    if(!$routeFound){ 
        http_response_code(404);
        echo 'ooooh, not found'; 
        //or:
        include('404.php');
        die();
    }
}

P.S。 http_response_code是一个内置函数:

https://secure.php.net/manual/en/function.http-response-code.php

编辑:您可以将代码以'http_response_code(404);'开头到一个单独的功能,然后调用它。