使用PHP和.htaccess进行url路由

Cai*_*ius 0 php apache .htaccess apache2

我想使用MVC模式将我的逻辑从演示文稿和数据中划分出来。

好吧,我一直在寻找我。但事实是,我什至不知道要搜索什么。

我正在尝试在php中设置MVC框架。我正在关注youtube上的教程,并且停留在路由点。

我已经阅读了很多指南,每个指南都以不同的方式讲课,只会造成更多的混乱。

关键是这样的:

我有一个.htaccess文件,其中包含一些指令(但是问题是我不知道所有这些指令的含义。我从未理解过htaccess逻辑)

Options -MultiViews
RewriteEngine On

#I think this sets the base url of the site?
RewriteBase /~caiuscitiriga/mvc/public

#What does this mean??
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f

#AND THIS?!
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
Run Code Online (Sandbox Code Playgroud)

然后我有这些php脚本:

Index.php

<?php

require_once '../app/init.php';

$app = new App();
Run Code Online (Sandbox Code Playgroud)

init.php

<?php

require_once 'core/App.php';
require_once 'core/Controller.php';
Run Code Online (Sandbox Code Playgroud)

App.php

不要问我为什么使用filter_varrtrim。因为这正是我要弄清楚的。如我之前所说,此代码不是我的。我敢肯定,把戏完全在.htacess和App.php中,但我不明白其逻辑

class App{


    protected $controller = 'home';
    protected $method = 'index';
    protected $params = [];


    public function __construct()
    {
        print_r($this->parseUrl());
    }

    public function parseUrl()
    {
        if(isset($_GET['url']))
        {
            return $url = explode('/', filter_var(rtrim($_GET['url'], '/'), FILTER_SANITIZE_URL));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Controller.php

<?php

class Controller{

}
Run Code Online (Sandbox Code Playgroud)

home.php

<?php

class Home extends Controller{

    public function index()
    {
        echo 'home/index';
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我通过以下网址:localhost /〜caiuscitiriga / mvc / public / home / index / maxine
我得到了:数组([0] => home [1] =>索引[2] => maxine)

为什么?!!?我的意思是,这是正确的。但为什么??

Pro*_*ock 6

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
Run Code Online (Sandbox Code Playgroud)

我将上面的内容理解为:如果请求不是目录,也不是文件,则采用路径并将其内部传递给index.php,并将url属性作为路径。

所以现在

//example.com/big/bad/mamma
Run Code Online (Sandbox Code Playgroud)

映射到

 //example.com/index.php?url=big/bad/mamma
Run Code Online (Sandbox Code Playgroud)

您可以根据需要调用上述脚本。

然后,您的解析网址将采用url的值(“大/坏/妈妈”),如果有,则删除尾部斜杠。然后在遇到正斜杠的任何地方分割字符串。因此,您将分为三个部分。数组中有哪个。

手册

FILTER_SANITIZE_URL过滤器将除去字母,数字和$ -_。+!*'(),{} | \ ^〜[]`<>#%“; /?:@&=以外的所有字符。

但是,如果您想了解这些内容,请对其进行分解:

$url = $_GET['url'];
var_dump($url);
$url = rtrim($url, '/');
var_dump($url);
$url = filter_var($url, FILTER_SANITIZE_URL);
var_dump($url);
$url = explode('/', $url);
var_dump($url);
Run Code Online (Sandbox Code Playgroud)