发现开源中国路由一个非常屌的功能

刘学炜 发布于 2017/02/24 16:36
阅读 799
收藏 1

https://www.oschina.net/news/81873/2017-february-yuanchuanghui

https://www.oschina.net/news/81873/2017-february-yuanchuanghui234214124-fsdfasf 访问的都是同一个页面 这个怎么做到的呢?

加载中
0
刘学炜
刘学炜

原来真实地址是这个 https://www.oschina.net/news/81873

OSC闲人
OSC闲人
恭喜,你答对了
1
eechen
eechen

这样做主要是为了URL美化和SEO优化.
实现也不难:
URL重写(URL rewrite)本质上是正则替换,分为两部分:
1. PHP把 /post.php?id=1024 重写为 /post/1024/alias 用于输出链接

<?php
$alias = 'php-7-release';
$beauty = ($alias) ? '/'.$alias : '';
echo preg_replace('%/post.php\?id=([0-9]+)%', '/post/${1}'.$beauty, '/post.php?id=1024');
//输出 /post/1024/php-7-release

2. Nginx 把 /post/1024 或 /post/1024/alias 重写为 /post.php?id=1024 调用PHP处理

location /dir {
	rewrite ^(.*)/post/([0-9]+)[/]{0,1}(.*)$ $1/post.php?id=$2 last;
}

http://www.example.com/dir/post/1024/php-7-release
http://www.example.com/dir/post/1024/
http://www.example.com/dir/post/1024
上述请求都等价于:
http://www.example.com/dir/post.php?id=1024

 

乌龟壳
乌龟壳
回复 @乌龟壳 : 比如CI虽然用了你所描述的集中路由,但是规则很简单,几乎等同文件路由,只不过加入了对function的自动匹配,也不需要每个页面都写个路由
乌龟壳
乌龟壳
回复 @eechen : 那是因为php慢,都是路由,但是你喜欢由c在fpm里实现的url直接映射php的路由,因为是c实现的,因为php慢,但不代表凭空就能通过url执行某个文件,不代表这种根据url直接映射文件名的逻辑不叫路由。另一方面,这方面性能损耗大不大看路由的实现逻辑,复杂就大,不复杂就不大,如果没啥特别需求,没事就把路由搞很复杂迎合所谓restful也是不合理的
eechen
eechen
回复 @乌龟壳 : 比如 location /post.php { fastcgi_pass 192.168.1.100:9000; } 在192.168.1.100这台服务器上只负责处理/post.php这个页面控制器的逻辑,不需要进入index.php在进行一次无谓的PHP层面的路由操作.
乌龟壳
乌龟壳
@eechen 回复@eechen : 啥叫分布式页面控制器?url到对应php文件这个路由不是凭空出来的,是fpm实现的集中式路由而已。根据文件名路由只不过是你所描述的[集中式路由]的一种根据文件名自动映射的写法而已
eechen
eechen
回复 @乌龟壳 : 我用的是分布式的页面控制器而不是集中式的前端控制器,对于采用页面控制器的PHP应用来说,入口就是Nginx,所以这样写很正常,比如Discuz!: rewrite ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/viewthread.php?tid=$2&extra=page%3D$4&page=$3 last;
下一页
0
Waising
Waising

最后一个参数是虚拟的。 没实际效果

0
全体人员
全体人员
最后一个参数是闹着玩的
0
罗格林
罗格林

最后一个参数是为了SEO?

返回顶部
顶部