php网站路由问题

我想给我博客蓝翟红尘的分类和文章自定义路由(不希望看到id数字,只希望全是英文字符)。
目前分类路由我是这样设置的:
1.先将c=a&m=b?id=x的路径变为c/m/id/x.html形式
2.然后用如下代码替换成新的路由

$reg_match_from = array(
         '/^index\/index\.html$/',
         '/^mood\/index\.html$/',
         '/^blog\/index\.html$/',
        '/^blog\/dtl\/id\/(\d+)\.html$/',
        '/^blog\/cate\/id\/1.html$/',
        '/^blog\/cate\/id\/2.html$/',
        '/^blog\/cate\/id\/3.html$/',
        '/^blog\/cate\/id\/4.html$/'
        );
    $reg_match_to = array(
        '',
        'mood',
        'blog/life',
        'blog/\\1.html',
        'blog/life',
        'blog/yuyou-story',
        'blog/plant',
        'blog/talk'
    );

3.再在服务器里rewrite规则里写如下规则:

rewrite ^/blog/life$ /store/index.php?c=blog&m=cate&id=1;
rewrite ^/blog/yuyou-story$ /store/index.php?c=blog&m=cate&id=2;
...

如上每天加一个分类,我都要去手工改代码和服务器router rewrite规则。要给博客文章实现如此需求,肯定不可取。
目前自己想到的方法是,后台创建文章时,将新的路由存储到数据库,然后路由分发时,再根据路由匹配数据库,生成c=a&m=b?id=x形式的路由,再进行分发,但感觉我这种想法很不靠谱。

望大神指点迷津。

阅读 4k
2 个回答

我来回答你这个问题,首先不知道你这个框架是什么,但是,正常的框架应该是这样子:

  1. 有一个框架全局配置;
  2. 框架根据路由自动解析参数;

例如如下这个伪静态路由:

http://www.example.com/blog/detail/id/1.html

那么前面的blogdetail应该解析出来对应的分别是Blog控制器和detail方法;
然后再来说后面的id/1.html那么,这个.html应该忽略掉;
然后解析出来就是一个$_GET数组,也就是变成:

$_GET = ['id' => 1];

这种形式;也就是后面就是键值对的参数,那么你就可以:

$id = $_GET['id'];

然后根据这个$id去查找数据,不过一般框架底层也封装了一层数据获取接口,如ThinkPHPI()方法,Yii2的yii::$app->request->get()等等。
所以来说,应该有一个全局通用配置,不要每篇文章都做一个路由配置,那么你就可以类似于这样子:

http://www.example.com/blog/detail/id/zhe-shi-yi-pian-ce-shi-bo-ke.html

也就是此时的id并不是你数据库对应的真实的自增id,而应该是你自己对你的博客名进行拼音翻译后得到的结果。
那么你也就需要对你博客翻译后的拼音用一个字段存到数据库,如pinyin_title字段,然后那么就是查询的话根据这个字段的值为$_GET['id']来取数据。

所以,从另外一个方面来看,你需要在存储的时候把你的标题名翻译成拼音,所以你还需要找一个拼音翻译的PHP程序,网上有很多我就不贴了。

既然能在WEB中有生成路由,不能再反解URI?nginx到PHP只是一个URI.具体到PHP怎么处理这个URI.规则都自己规定好了?

实在没办法的话,不想改动太大,用PHP生成重写文件,在这个站的server下包含这个文件,然后shell跑个死循环监听这个文件.一发生改变.立马做nginx平滑重启 /usr/nginx/sbin/nginx -s reload.

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