如何制作codeigniter样式的URI段

时间:2012-01-27 21:27:56

标签: php .htaccess

我想知道如何在项目中创建codeigniter样式的url段。

除了捕获段的htaccess规则之外,如何在PHP中完成?

在窥探codeigniter源代码后,我找不到对捕获用法的htaccess文件的任何引用。

关于如何做到这一点的任何想法?

4 个答案:

答案 0 :(得分:2)

假设您通过Apache mod_rewrite或Nginx将所有请求传递给index.php:

// Get the current URL path (only) and convert encoded characters back to unicode
$path = rawurldecode(trim(parse_url(getenv('REQUEST_URI'), PHP_URL_PATH), '/')));

// array merge with defaults
$segments = explode('/', $path) + array('home', 'index');

//First two segments are controller/method
$controller = array_shift($segments);
$method = array_shift($segments);

// @todo serious security checking here!

// Finally, load and call
$controller = new $controller;
$controller->$method($segments);

你的控制器看起来像这样

class Home
{
    public function index($params)
    {
        print_r($params);
    }
}

答案 1 :(得分:1)

你要做的是在htaccess中设置一个单独的url参数,然后使用字符串拆分方法从该字符串中检索模型,控制器和视图,然后调用模型类,控制器类,然后渲染将数据放入视图中。转型将如下所示:

mysite.com/index.php?url=/tasks/all => mysite.com/tasks/all 它调用任务模型,然后在任务控制器内调用名为“all()”的函数。

一旦该网站重新上线,请查看教程的htaccess部分 - 他很好地展示了它的完成情况http://www.henriquebarroso.com/how-to-create-a-simple-mvc-framework-in-php/

答案 2 :(得分:1)

您仍然需要将所有虚拟请求“转发”到物理文件。

这个想法是,任何与磁盘上的物理文件或文件夹不匹配的URI都会被重写(通常通过mod_rewrite)到你的index.php文件(它通常是你的索引文件,所以直接调用索引也可以) ,它将URI附加到路径或作为查询字符串参数:

RewriteCond %{REQUEST_FILENAME} !-f  # Not a real file
RewriteCond %{REQUEST_FILENAME} !-d  # Not a real folder
RewriteRule ^(.*)$ index.php/$1 [L]  # Rewrite to index.php, with a leading slash, followed by the URI

或者,您可以使用标准错误文档处理程序(仍然在.htaccess或apache配置中,但不需要mod_rewrite!):

<IfModule !mod_rewrite.c>
    ErrorDocument 404 /index.php
</IfModule>

现在控制权被统一传递给index.php文件,您需要一个路由器机制来匹配到正确控制器的路由。理想情况下,您有一个静态和动态路由列表。静态路由是与URI的直接匹配,动态是正则表达式匹配。首先检查静态路由,因为它就像单个哈希查找一样简单,而你必须遍历所有动态路由。

为了提高性能,最好将更常见的动态路由放在列表的开头,最后放置一些不起眼的路径。

答案 3 :(得分:0)

使用.htaccess文件来使用mod_rewrite来重写url的基础对此至关重要。否则,浏览器会将每个段视为假定的文件夹或文件(取决于您是否有尾随/)

但是,如果你有这个,你可以简单地使用这篇文章中描述的方法:

how do i parse url php