什么是路由?路由有什么用?

什么是路由?路由有什么用?
为什么改变不同url可以访问到不同的页面?

阅读 11.6k
4 个回答

PHP 路由

在远古时代(PHP 4 面向过程),人们这么用URL的

一个文件代表一个执行对象,根据名字可以看出来是干嘛的

http://www.xx.com/news/create.php
http://www.xx.com/news/edit.php?id=123
http://www.xx.com/comment/edit.php?id=456

后来人们觉得麻烦(PHP 4~5过渡阶段),开始这么做,在一个文件里面写

通过分支来判断执行对象(discuz 7 这么做的)

switch($_GET['action']) {
    case 'create': 
    ...
    break;
    case 'edit'
    $id = $_GET['id'];
    ...
}
http://www.xx.com/news.php?action=create
http://www.xx.com/news.php?action=edit&id=123
http://www.xx.com/comment.php?action=edit&id=456

接着Apache支持了Rewrite技术

因为大家觉得网址太长了,以及当年的SEO喜欢抓取静态页面等原因

所以使用了rewrite做了伪静态(比如Discuz至今还在使用)

http://www.xx.com/news/1.html

==使用rewrite指向到==>

http://www.xx.com/news.php?id=1

接着PHP支持了面向对象(OO),且apache支持PATHINFO,路由时代到来

rewrite的确解决了很多人的麻烦,但是最大的的一个缺点:
一个网址就要设置一条rewrite规则,所以聪明的开发者结合PHPINFO技术创造了路由

什么是pathinfo,是指http://www.xx.com/index.php/news/create
在php文件后面可以继续写一个字符串/news/create/开头,可以是任意东西
然后Apache通过htaccess等技术手段重写 http://www.xx.com/a/b/c -> http://www.xx.com/index.php/a/b/c

框架通过读取PHPINFO,比如CI(Kohana)的路由是自动代理(无法自定义路由名),看如下代码

http://www.xx.com/news/create

==指向到==>

class News {
  public function create() {
     echo 'something';   
  }
}

自定义路由时代

自动代理的路由方式满足不了开发者,Laravel横空出世,可以将路由指向到任意地方

比如这就是将news/kill的GET请求,全部指向到NewsController.php下的kickme函数
http://www.xx.com/news/kill
===>
            路由名        路由指向类
Route::get('news/kill', 'NewsController@kickme');
Route::get('news/delete/{id}', 'NewsController@delete');
//id 会传到delete做参数

RESTful 时代

程序员还是觉得这网址胡乱来的方式太糟糕了,并且在互联网上,一般就CRUD(增删查改)这四种方法,因此,提出了RESTful 规范
segmentfault就是这种方式
请求方法 路径              对应函数        路由名字   解释
GET     /user             index()       user.index  首页
GET     /user/{id}        show($id)     user.show   ID对应的用户资料
GET     /user/create      create()      user.create 新建用户页面
POST    /user             store()       user.store  保存新建的资料
GET     /user/{id}/edit   edit($id)     user.edit   编辑用户资料
PUT/PATCH  /user/{id}     update($id)   user.update 保存编辑的资料
DELETE    /user/{id}      destory($id)  user.destory 删除用户

伴随着RESTful的标准出台,Laravel继续跟进,提出了无比省事的资源路由

Route::resource('user', 'UserController'); 使用上面的方式对应

这便是路由到目前的历史(2019)

你以为结束了?

  • laravel 还支持将路由绑定到指定的域名(泛域名也可以)
  • laravel 还支持对某一类路由(Route::group),控制登录、控制权限(中间件)
  • laravel 是啥,提那么多次干嘛?2019年不会laravel,是不是落伍了?

PHP路由简单实现方式

这是PHP的自动代理路由实现方法,伪代码如下(具体实现要比这复杂的多)

http://www.xx.com/index.php/news/create

$pathinfo = $_SERVER['PATH_INFO'];
list($ctrl, $action) = explode('/', ltrim($pathinfo, '/'));

$class = 'App\Http\Controllers\'. ucfirst($ctrl). 'Controller';
if (class_exists($class) && method_exists($class, $action))
    return (new $class)->$action();

Javascript路由

js使用的方式类似于PHP,但是利用的location.hash

伪代码如下(具体实现要比这复杂的多):

// http://www.xx.com/index.html#/news/create

var pathinfo = location.hash;
//var paths = pathinfo.split('/');

ajax({
    url: pathinfo + '.html'
    success: function(html){
        $('body').html(html);
    }
})

结语

一个好的路由,

  • 自定义任何的路由名,指向到任意的Controller
  • 支持RESTful的路由,遵循国际规范

所以,如今的PHP框架中,路由逐渐替代了rewrite,成为了最重要的组成部分

简单来说,路由就是给指定的页面分配一个url地址。
通过这个url地址,你就能访问到该页面了。

比如你写了一个页面,/static/public/game/index.html,
你的服务器项目域名http:www.dsxxx.com
你通过一些方式,给该页面配置了一个路由地址/game
那么,你就可以通过http:www.dsxxx.com/game访问到上面这个index.html文件了

改变不同的url访问到不同的页面,都是通过一些方式做了配置的,具体的方式你可以随着学习的深入逐步了解到

路由可以理解成根据请求的不同URL,映射到不同处理程序上。反过来,需要对每个不同的页面定义不同的路由来实现区分界面。

路由的作用就是根据路由协议转发数据的.
一般框架的路由系统都设计成路由器+路由协议. (Router + Route)
路由系统的作用就是把request url根据路由协议转发到控制器上.

url的全称叫统一资源定位符, 所以不同的url代表是访问不同的资源.
所以在定义路由的转发规则时, 一般情况下不同的url会转发到不同的控制器上, 也就获取到不同的资源.
就算是相同的资源, 不同的访问方式, 对这个资源的操作方式也不尽相同. 比如restful架构.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题