Я новичок в 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». Любая помощь будет принята с благодарностью.