用2个或更多的参数重写网址

时间:2017-12-05 21:15:00

标签: php .htaccess mod-rewrite url-rewriting

之前我问过这样的问题,但由于我仍然无法找到答案,我会再次提出问题:-s。

我正在使用这个非常基本的模板'脚本:

require_once 'core/init.php';

if(empty($_GET['page'])){
    header('Location: home');
    die();
}

$basePath = dirname(__FILE__) . '/';
$viewPath = $basePath . 'view/';

$view = scandir($viewPath);

foreach($view as $file)     
{
    if (!is_dir($viewPath . $file))
    {
        $pages[] = substr($file, 0, strpos($file, '.'));

    }
}

if(in_array($_GET['page'], $pages)){
    include($viewPath . $_GET['page'] . '.php');
} else{
    include($basePath . '404.php');
}

我正在使用此htaccess文件将我的网址从/base/index.php?page=somepage重写为/base/somepage(某些网页是我的模板文件夹中的.php文件)

RewriteEngine On

RewriteBase /base/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^?]*) index.php?page=$1 [L,QSA]

使用1参数它可以正常工作但我的问题是我不知道如何重写第二个参数/base/profile?user=username(没有htaccess文件,这将看起来像/base/index.php?page=profile?user=username)我希望它看起来像/base/profile/username

我希望这个问题是可以理解的:-s

1 个答案:

答案 0 :(得分:1)

路由是一个真正的问题,我不能在一条评论中详尽无遗,但我会努力做到最好。请原谅我的大学英语,如果你不明白,请告诉我。我还有很多需要学习的东西,所以我会尝试通过我做的东西来解释,但它可能是完全可以改进的。

今天关于路由和解释请求的PHP标准建议书应该实现PSR7

我个人通过我正在构建的MVC框架中的FrontController Design Pattern使用它来理解这些概念。我的文件夹组织如下:

  • 公开:
    我在哪里启动我的Web服务器,在那里你可以找到JavaScript / CSS。有一个index.php只包含

    require_once( '../的index.php');

  • App: 哪里有路由器,主要是所有通用代码

  • Src: 哪里有应用程序的特定代码。这意味着现在的控制器和实体。

  • 供应商: 诸如GuzzleHTTP之类的Composer依赖项在实际请求和代码之间有一个类。

这是我的root的index.php中的代码:

<?php
require_once 'vendor/autoload.php';

use Namespace\FrontController;
use \GuzzleHttp\Psr7\ServerRequest;
use function Http\Response\send;

$front_ctrl = new FrontController(ServerRequest::fromGlobals());
send($front_ctrl->getResponse());

它的主要观点是我在实现PSR7的类的实例中解释请求。

在我的FrontController中,我的请求通过一些方法(例如删除尾部斜杠),最终在路由器类中发送进行处理。

我的Router类的purpouse是检查数组中是否存在URI,我在json文件中以这种格式存储了所有路由:

{
    "/": [
      "AppController",
      "indexAction",
      ["GET", "POST"]
    ],...
}

这是我使用正则表达式匹配URI内的变量(例如/ article /:id)的地方 此类可以恢复为“我的应用程序中是否存在此URI?”。

此时,我实例化一个新的Route类,其中所有数组都作为参数。从这里开始,我必须回答诸如“它是否附加到控制器中的方法?”,“处理它的方法是否被处理?”之类的问题。 ......

总而言之,此时,我有一个代表请求的类实例,另一个代表所有我的路由的实例。我正面对它们以获得 ONE 路线,我将通过类路线的实例进行操纵。

如果它通过了所有这些测试,那么我可以实例化正确的控制器,其中将有应用程序的特定逻辑部分,需要一些操作来获取数据,我将在我的视图中发送以生成HTML输出我将一直发送回我的函数send,以便在您要求特定URI时显示输出。

这个长答案的要点是向您展示几乎完全独立于服务器的东西。如果您的应用程序变得更大并且必须处理更具体的路由规则,这也很有用。它会强制您分离应用程序的所有包:Controller不是模型也不是路由器......

尝试找到一些很好的教程来学习PHP中的面向对象编程,这样可以避免轻松的安全问题,并在开发应用程序时让您更加舒适:)

希望这是可以理解和有帮助的