【问题标题】:Rewrite url with 2 or more params使用 2 个或更多参数重写 url
【发布时间】:2018-05-19 15:41:14
【问题描述】:

我以前问过这样的问题,但由于我仍然找不到答案,所以我会再问一次:-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

【问题讨论】:

  • 刚刚检查...你看到这个post了吗?
  • 嘿@AlejandroMontilla,是的,我已经看到了,但是由于我没有使用 Laravel,所以我无法弄清楚:(
  • 你应该看到@Zyigh的答案,这是一个非常好的解释。

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


【解决方案1】:

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

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

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

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

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

  • 应用程序: 哪里有路由器和大部分通用代码

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

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

这是我的根目录 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 类的目的是检查 URI 是否存在于我以这种格式存储在 json 文件中的所有路由的数组中:

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

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

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

总而言之,在这一点上,我有一个代表请求的类的实例,另一个代表我的所有路由的实例。我与他们对抗以获得 ONE Route,我将通过 Class Route 的实例对其进行操作。

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

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

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

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

【讨论】:

    猜你喜欢
    • 2016-07-29
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    • 2012-10-09
    相关资源
    最近更新 更多