MAMP环境正常的PHP路由在生产服务器失效问题排查
MVC路由生产环境失效排查求助
我正在学习MVC架构,本地MAMP环境下路由功能运行正常,但部署到生产服务器后路由失效。服务器可以执行index.php,但无法触发控制器逻辑。经过3天排查,发现代码卡在route.php的preg_match判断语句处。通过var_dump输出可知:$url为字符串"/",$request_uri为空字符串,$parameters为NULL。
相关代码如下:
index.php
<?php //require __DIR__ ."/database.php"; //require __DIR__ ."/model.php"; require __DIR__. '/route.php'; require __DIR__. '/controller/controller.php'; Route::run("/","HomeController@index");
route.php
<?php class Route { public static function parse_url(){ $dirname= dirname($_SERVER["SCRIPT_NAME"]); $basename=basename($_SERVER["SCRIPT_NAME"]); $request_uri=str_replace([$dirname,$basename], null, $_SERVER["REQUEST_URI"]); return $request_uri; } public static function run($url,$callback,$method="GET"){ $method =explode('|', strtoupper($method)); if (in_array($_SERVER["REQUEST_METHOD"],$method)){ $patterns= [ '{url}'=>'([0-9a-zA-Z]+)', '{id}'=> '([0-9]+)' ]; $url= str_replace(array_keys($patterns), array_values($patterns),$url); $request_uri=self::parse_url(); if (preg_match('@^'.$url.'$@',$request_uri,$parameters)){ //代码在此处停止执行 unset($parameters[0]); if (is_callable($callback)){ call_user_func_array($callback, $parameters); } $controller= explode('@',$callback); $className=explode('/',$controller[0]); $className=end($className); $controllerFile=__DIR__."/controller/".strtolower($controller[0]).'.php'; if (file_exists($controllerFile)){ require $controllerFile; call_user_func_array([new $className,$controller[1]],$parameters); } } } } }
controller.php
<?php class Controller{ public function view($name, $result=null,$data=null,$redirect=null){ function showMessage(){ if (isset($_SESSION["message"])){ echo $_SESSION["message"]; unset($_SESSION["message"]); } } $result=$result; $data=$data; if (isset($redirect)){ header("Location:/project/$redirect"); } require __DIR__."/../view/" . strtolower($name). '.php'; } public function model($name){ require __DIR__."/../model/" . strtolower($name). '.php'; return new $name(); } }
HomeController.php
<?php class HomeController extends Controller{ public function index(){ $this->view("home"); } }
.htaccess
RewriteEngine On RewriteRule ^([0-9a-zA-Z-_/]+)$ index.php [QSA]
内容的提问来源于stack exchange,提问作者Selim
相关产品推荐
相关产品推荐

