Продолжайте сталкиваться с 403 в приложении MVC PHP, которое я пытаюсь создать - PullRequest
0 голосов
/ 11 сентября 2018

Я новичок в MVC в PHP и впервые начал писать код сегодня, но я застрял на следующей проблеме.

мой .htaccess перенаправляет все в index.php [моя точка входа в Bootstrap] ион отлично работает на моем сервере разработки на моей локальной машине.

Я не вызываю никаких вещей, например, файлы - это Controllers / Action / Methods, я просто извлекаю информацию, которую вы видите в массиве.

https://exception.localhost/controller/action
Выход - это то, что я ожидаю

 Array(
    [Domain] => exception.localhost
    [System] => exception
    [Controller] => Controller
    [Action] => Action
    [User_Agent] => Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36
    [User_IP_Address] => ::1
    [Request_Time] => 1536610768
    [User_Language] => en-GB,en-US;q=0.9,en;q=0.8
    [User_Request_URI] => /controller/action
    [Request_Scheme] => https
    [User_Browser] => Chrome
    [User_OS] => Windows 7
    [Mobile_User_Agent] => false )

Затем я изменяю контроллер на 'error' https://exception.localhost/error и все равно получаю то, что ожидаю.

 Array(
    [Domain] => exception.localhost
    [System] => exception
    [Controller] => Error
    [Action] => Index
    [User_Agent] => Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36
    [User_IP_Address] => ::1
    [Request_Time] => 1536611137
    [User_Language] => en-GB,en-US;q=0.9,en;q=0.8
    [User_Request_URI] => /error
    [Request_Scheme] => https
    [User_Browser] => Chrome
    [User_OS] => Windows 7
    [Mobile_User_Agent] => false)

Как только я ставлю что-нибудь после 'error', как это https://exception.localhost/error/index, я получаю 403 Error, но если я пишу 'error' неправильный 'eror', это работает так, как я ожидаю

 Array(
    [Domain] => exception.localhost
    [System] => exception
    [Controller] => Eror
    [Action] => Index
    [User_Agent] => Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36
    [User_IP_Address] => ::1
    [Request_Time] => 1536611654
    [User_Language] => en-GB,en-US;q=0.9,en;q=0.8
    [User_Request_URI] => /eror/index
    [Request_Scheme] => https
    [User_Browser] => Chrome
    [User_OS] => Windows 7
    [Mobile_User_Agent] => false)

Я даже не запускал обработку ошибок или маршрутизацию запросов, поэтому независимо от того, какой контроллер или действие я установил, он всегда должен работать, что он делает https://exception.localhost/MadeUpController/MadeUpAction.

 Array(
    [Domain] => exception.localhost
    [System] => exception
    [Controller] => MadeUpController
    [Action] => MadeUpAction
    [User_Agent] => Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36
    [User_IP_Address] => ::1
    [Request_Time] => 1536611855
    [User_Language] => en-GB,en-US;q=0.9,en;q=0.8
    [User_Request_URI] => /MadeUpController/MadeUpAction
    [Request_Scheme] => https
    [User_Browser] => Chrome
    [User_OS] => Windows 7
    [Mobile_User_Agent] => false)

Имеет 'apache'зарезервировать слово' ошибка '?

Мой полный код здесь * не самый лучший, но я только сегодня запустил MVC.

App.php

<?php namespace App; class Core{

protected $render = array();


public function __construct(){

    $this->render['Domain'] = $_SERVER['SERVER_NAME'];

    $subDomain = explode(".", trim(str_replace(((new Configuration())->Domain()),"",filter_var(trim($_SERVER['SERVER_NAME']), FILTER_SANITIZE_URL)), '.'));

    if(!in_array($subDomain[0], ((new Configuration())->ReservedSubDomains()), true)){

        switch(count($subDomain)){

            case "1":
            $this->render['Store'] = ($subDomain[0] == 'www' || $subDomain[0] == "")? "main" : $subDomain[0];
            break;

            default:
                $this->render['Store']  = "main";
            break;

        }

    }else{
        $this->render['System'] = $subDomain[0];
    }

    $query = array();

    if(isset($_SERVER['REDIRECT_URL'])){

    if (isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING'])){

        parse_str($_SERVER['QUERY_STRING'], $query);

    }


    $router = explode("/", filter_var(trim($_SERVER['REDIRECT_URL'], '/'), FILTER_SANITIZE_URL));

        switch(count($router)){

            case "1":
                $this->render['Controller'] = ($router[0] != "")? ucfirst($router[0]): "Index";
                $this->render['Action'] = "Index";
                (!empty($query))? $this->render['Arguments'] = $query : "" ;
                break;

            case "2":
                $this->render['Controller'] = ($router[0] != "")? ucfirst($router[0]): "Index";
                $this->render['Action'] =  ($router[1] != "")? ucfirst($router[1]): "Index";
                (!empty($query))? $this->render['Arguments'] = $query : "" ;
                break;

            default:
                $this->render['Controller'] = ucfirst($router[0]);
                $this->render['Action'] = ucfirst($router[1]);
                unset($router[0]);
                unset($router[1]);

                    $arguments = array();

                    if(count($args = array_values($router)) > 0){
                        for($params = 0; $params <= (count($args)); $params = ($params + 2)){
                            if(isset($args[$params])){
                                $arguments[$args[$params]] = (isset($args[$params+1]))? $args[$params+1] : "";
                            }
                        }

                        $this->render['Arguments'] = array_merge($arguments, $query);

                    }

            break;

        }
    }else{

        $arguments = array();

        $this->render['Controller'] = "Index";
        $this->render['Action'] = "Index";  

        if (isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING'])){

            parse_str($_SERVER['QUERY_STRING'], $arguments);

        }   

        (!empty($arguments))? $this->render['Arguments'] = $arguments : "" ;

    }

    (isset($_POST) && !empty($_POST))? $this->render['Post_Arguments'] = $_POST : "";
    $this->render['User_Agent'] = $_SERVER['HTTP_USER_AGENT'];
    $this->render['User_IP_Address'] = $_SERVER['REMOTE_ADDR'];
    $this->render['Request_Time'] = $_SERVER['REQUEST_TIME'];
    $this->render['User_Language'] = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
    (isset($_SERVER['REQUEST_URI']) && !empty((trim($_SERVER['REQUEST_URI'], '/'))))? ($this->render['User_Request_URI'] = $_SERVER['REQUEST_URI']) : "";       
    $this->render['Request_Scheme'] = $_SERVER['REQUEST_SCHEME'];
    (isset($_SERVER['HTTP_REFERER']) && !empty($_SERVER['HTTP_REFERER']))? ((strpos($_SERVER['HTTP_REFERER'], ((new Configuration())->Domain())) === false)? $this->render['Referral_Site_Location'] = $_SERVER['HTTP_REFERER'] : "") : "" ;
    (isset($_COOKIE) && !empty($_COOKIE))? $this->render['User_Cookie'] = $_COOKIE : "";
    (isset($_SERVER['HTTP_REFERER']) && !empty($_SERVER['HTTP_REFERER'])) ? ((strpos($_SERVER['HTTP_REFERER'], ((new Configuration())->Domain())) === false)? $this->render['Referral_Site_Doamin'] = (parse_url($_SERVER['HTTP_REFERER'])['host']) : "") : "";
    $this->render['User_Browser'] = $this::UserBrowserDetection($this->render['User_Agent']);
    $this->render['User_OS'] = $this::UserOSDetection($this->render['User_Agent']);
    $this->render['Mobile_User_Agent'] = $this::UserMobileBrowserDetection($this->render['User_Agent']);
     unset($_POST);
     unset($_GET);


}

protected function UserOSDetection($User_Agent){

    $UserOS = "Unknown";

    $os     = array(
                      '/windows nt 10/i'      =>  'Windows 10',
                      '/windows nt 6.3/i'     =>  'Windows 8.1',
                      '/windows nt 6.2/i'     =>  'Windows 8',
                      '/windows nt 6.1/i'     =>  'Windows 7',
                      '/windows nt 6.0/i'     =>  'Windows Vista',
                      '/windows nt 5.2/i'     =>  'Windows Server 2003/XP x64',
                      '/windows nt 5.1/i'     =>  'Windows XP',
                      '/windows xp/i'         =>  'Windows XP',
                      '/windows nt 5.0/i'     =>  'Windows 2000',
                      '/windows me/i'         =>  'Windows ME',
                      '/win98/i'              =>  'Windows 98',
                      '/win95/i'              =>  'Windows 95',
                      '/win16/i'              =>  'Windows 3.11',
                      '/macintosh|mac os x/i' =>  'Mac OS X',
                      '/mac_powerpc/i'        =>  'Mac OS 9',
                      '/linux/i'              =>  'Linux',
                      '/ubuntu/i'             =>  'Ubuntu',
                      '/windows phone/i'      =>  'Windows Mobile',
                      '/iphone/i'             =>  'iPhone',
                      '/ipod/i'               =>  'iPod',
                      '/ipad/i'               =>  'iPad',
                      '/android/i'            =>  'Android',
                      '/blackberry/i'         =>  'BlackBerry',
                      '/webos/i'              =>  'Mobile',
                      '/silk/i'               =>  'Amazon Fire OS',
                      '/bb10;/i'              =>  'BlackBerry'
                );

foreach ($os as $regex => $value){
    if(preg_match($regex, $User_Agent)){
        $UserOS = $value;
    }

}

    return $UserOS;

}

protected function UserBrowserDetection($User_Agent){

  $UserBrowser = "Unknown";

      $browsers = array(
                        '/mobile/i'    => 'Handheld Browser',
                        '/msie|trident/i'      => 'Internet Explorer',
                        '/firefox/i'   => 'Firefox',
                        '/safari/i'    => 'Safari',
                        '/chrome/i'    => 'Chrome',
                        '/edge/i'      => 'Edge',
                        '/opera/i'     => 'Opera',
                        '/netscape/i'  => 'Netscape',
                        '/maxthon/i'   => 'Maxthon',
                        '/konqueror/i' => 'Konqueror',
                        '/silk\/[0-9.]+/i' => 'Amazon Silk Browser'
                        );

foreach ($browsers as $regex => $value){
    if(preg_match($regex, $User_Agent)){
        $UserBrowser = $value;
    };

}

    return $UserBrowser;

}

protected function UserMobileBrowserDetection($User_Agent){
    if(preg_match('/mobile/i', $User_Agent)){
        return "true";
    }else{
        return "false";
    }
}

public function Application(){
    return $this->render;
}}?>

Файл Configuration.php

 <?php namespace App; class Configuration{

public function Domain(){
    return "localhost"; 
}

public function ReservedSubDomains(){
    return array("login", "administrator", "seller", "user", "api", "monitor", "webmaster", "status", "register", "search", "exception");
}}?> 

.htaccess Файл, который я использую

RewriteEngine on 
ServerSignature off 

RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l

RewriteRule ^(.*)$ index.php [QSA,L]

и index.php

<?php namespace App;require("etc/Configuration.php"); require("code/App.php"); //require("etc/Validate.php"); $APP = (new Core())->Application(); print_r($APP); //$Validation = new Core\Validate($APP);?>

Как я говорю, я не могувыясните, почему «apache» выдает ошибку 403, если только «apache» не зарезервирует слово «error». Любая помощь будет принята с благодарностью.

...