qeephp url美化之后的 SEO问题

一个网站运营一段时间后,栏目设置很可能发生变化,此时就有可能导致 URL 变化。而 URL 变化的最大问题就是导致以前的连接失效,对用户体验非常不好,而且也会影响搜索引擎对网站的收录。所以我们必须保证以前的 URL 不失效。

例如以前新闻页面的网址是 http://msplinks.com.cn/MDFodHRwOi8vbXkuY29tLzEyMzQ1Ni5odG1s,而现在是 http://msplinks.com.cn/MDFodHRwOi8vbXkuY29tL25ld3Mvc3BvcnRzLzEyMzQ1Ni5odG1s。对于这种需求,我们利用 URL 路由可以轻松搞定。

先写两个规则:

  1. # 解析和生成新的新闻页面 URL
  2. news_page:
  3.   regex: '/news/([a-z]+)/([0-9]+)\.html'
  4.   config:
  5.     category: 1
  6.     news_id:  2
  7.   defaults:
  8.     controller: news
  9.     action:     show
  10. # 解析老的新闻页面 URL
  11. news_page_keep_old:
  12.   regex: '/([0-9]+)\.html'
  13.   config:
  14.     news_id:  1
  15.   defaults:
  16.     controller: news
  17.     action:     show
复制代码

上述两条规则,放在前面的优先级更高。

当请求的 URL 是 http://msplinks.com.cn/MDFodHRwOi8vbXkuY29tLzEyMzQ1Ni5odG1s 时,前面的规则匹配失败,而后面的规则匹配成功。因此请求送给了 news 控制器的 show 动作方法处理,并且附带 news_id 参数。

  1. function actionShow()
  2. {
  3.     $news_id = intval($_GET['news_id']);
  4.     $news = News::find($news_id)->get();
  5.    
  6.     ... 显示新闻内容
  7. }
复制代码

这样就保证了原有 URL 的有效性。

那么当请求是 http://msplinks.com.cn/MDFodHRwOi8vbXkuY29tL25ld3Mvc3BvcnRzLzEyMzQ1Ni5odG1s 时,前面的规则就匹配成功,此时就不会再匹配后面的规则。而请求还是 actionShow() 来处理。前面的规则多了一个 category 参数,这里并没有用上,直接忽略即可。但这个参数是必不可少的,会用于后面的 URL 生成。

现在我们来看看模板中生成 URL 的代码:

  1. url('news/show', array(
  2.     'news_id' => $news->id,
  3.     'category' => $news->category_name
  4. ))
复制代码

可以看到,这里我们生成 URL 时使用了 category 参数,因此前面的规则会被用于生成 URL。最终我们会得到类似 http://msplinks.com.cn/MDFodHRwOi8vbXkuY29tL25ld3MvY2Fycy8yMzM0My5odG1s 这样的结果。

现在我们已经完美的解决了问题:既保证了以前 URL 的有效性,又让访问者在访问老页面后可以通过页面中的 URL 导航到新格式的 URL 中。

--------------------------------------

URL 随心变

除了 SEO,URL 路由还可以让我们随心所欲的构造 URL 地址。例如 http://msplinks.com.cn/MDFodHRwOi8vcWVlcGhwLmNvbS9jYXNlcy8xOQ== 这个 URL 规则是:

  1. cases_show:
  2.   pattern: "/cases/:id"
  3.   defaults:
  4.     controller: "cases"
  5.     action: "show"
  6.   config:
  7.     id: "[0-9]+"
复制代码

我们把规则改为:

  1. cases_show:
  2.   regex: '/mygod/show\-me\-the\-money/news\-sports\-(\d+)\.html'
  3.   defaults:
  4.     controller: "cases"
  5.     action: "show"
  6.   config:
  7.     id: 1
复制代码

这时 URL 就变成 http://msplinks.com.cn/MDFodHRwOi8vcWVlcGhwLmNvbS9teWdvZC9zaG93LW1lLXRoZS1tb25leS9uZXdzLXNwb3J0LTE5Lmh0bWw= 了。可以说和以前的 URL 简直是两码事。

而这些修改和变化,完全不需要我们修改应用程序中的代码和模板代码,唯一需要改动的就是路有规则表。

原文地址:https://www.cnblogs.com/buffer/p/1715438.html