techsir 登陆 |注册|TS首页
  首页 快活林 猿氏悟语

分析WordPress的Rewrite机制 作者:Black-Xstar

By: 冰客 发表于 2008-10-7 17:52:08 · 10431次点击   回复:1   
由于我的新blog软件生活使用了wordpress构架,为了更好的适应,我甚至选择了LAMP的服务器来运行。
大家都知道,apache下面有一个强大的mod_rewrite模块,使得链接可以重写成http://applife.net/2008/03/welcome-to-my-new-blog/这样的永久链接形式,十分美观和方便,最重要的是搜索引擎友好,对SEO只有好处。我的新blog在这几天时间里已经被google收录所有页面,从refer看已经能看到来自搜索引擎的访问了。

但是这个rewrite机制我一直很不明白,今天看到了一篇文章,终于能够解释一部分疑惑,保留下来。

引用内容
大家都知道,WordPress 可以通过 Apache 的 mod_rewrite 模块,使用 .htaccess 文件来重写URL,生成静态链接(或称永久链接),如 http://example.com/年/月/日/日志名/ ,使URL更加美观也对搜索引擎更友好。但具体是如何实现的,可能有些朋友不是很清楚,因此我在这里稍稍阐述下。而在不支持 .htaccess 的主机环境中,也可以使用 http://example.com/index.php/年/月/日/日志名/ 这种形式的URL,以及使用ISAPI等东东,原理都差不多,本文就不探讨了。

我以 http://www.oldjan.cn/database-dict-for-wordpress-23/2008/02/25/ 为具体例子进行分析。首先我们先来看看WordPress根目录下的 .htaccess 文件,其中有一段如下

程序代码

  1. RewriteCond %{REQUEST_FILENAME} !-f
  2. RewriteCond %{REQUEST_FILENAME} !-d
  3. RewriteRule . /index.php [L]

复制代码
意思是指,当接收到的请求不是一个文件或目录时,则会重写为WordPress根目录下的index.php文件,然后 index.php 就开始处理请求。

index.php 会包含 wp-blog-header.php, wp-blog-header.php 会包含 wp-config.php, wp-config.php 又会包含 wp-settings.php,最后 wp-settings.php 会包含一大堆文件进来,晕了吧。其中, wp-includes/query.php 中的 WP_Query 类和 wp-includes/classes.php 中的 WP 类是Rewrite最主要的,因此我们将对象实例化

程序代码

  1. $wp_the_query =& new WP_Query();
  2. $wp_query     =& $wp_the_query;
  3. $wp_rewrite   =& new WP_Rewrite();
  4. $wp           =& new WP();

复制代码
做了这么多准备工作后,WP真正开始处理请求了,在 wp-blog-header.php 中调用wp()函数,在这个函数执行了 WP 类的成员方法main()


程序代码

  1. function main($query_args = ”) {
  2.     $this->init(); //初始化,获取当前用户信息
  3.     $this->parse_request($query_args); //解析请求
  4.     $this->send_headers(); //发送头信息
  5.     $this->query_posts(); //查询日志
  6.     $this->handle_404(); //操作404(URL地址不存在)
  7.     $this->register_globals(); //注册全局变量
  8.     do_action_ref_array(’wp’, array(&$this));
  9. }

复制代码
我们进入$this->parse_request()瞧瞧,通过$_SERVER[’REQUEST_URI’]和过滤得到字符串 ‘database-dict-for-wordpress-23/2008/02/25′ 赋值给$request_match,与存储在数据库中的rewrite规则集进行正则匹配,rewrite规则集类似与下面这个样子,当然,比下面的多了很多。

程序代码

  1. [wp-feed.php$] => index.php?feed=feed
  2. [wp-commentsrss2.php$] => index.php?feed=rss2&withcomments=1
  3. [(about)/trackback/?$] => index.php?pagename=$matches[1]&tb=1
  4. [page/?([0-9]{1,})/?$] => index.php?&paged=$matches[1]
  5. [comments/(feed|rdf|rss|rss2|atom)/?$] => index.php?&feed=$matches[1]&withcomments=1
  6. [search/(.+)/?$] => index.php?s=$matches[1]
  7. [category/(.+?)/?$] => index.php?category_name=$matches[1]
  8. [tag/(.+?)/?$] => index.php?tag=$matches[1]

复制代码
我的请求与 ‘([^/]+)/([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})(/[0-9]+)?/?$’ 这条匹配,所以我的请求被转化为 ‘name=database-dict-for-wordpress-23&year=2008&monthnum=02&day=25&page=’,如果请求都没匹配上那就肯定404了。接着就是通过 $this->query_posts() 来查询日志信息了,查询不到那还是404,废话…

把这些都整完了,回到 wp-blog-header.php,包含 wp-includes/template-loader.php 来加载模板并显示,日志显示日志,页面显示页面,404显示404,总之就是各神归位,OVER
10431次点击
1个回复  |  直到 2008-10-7 17:52:08
   
  Reply   
东方不摆      2008-10-7 17:52:08
不错的文章 谢谢冰客哥哥分享
添加一条新回复
您需要登录后才可以回帖 登录 | 成为会员 新浪微博登陆

标签云|手机版|科技先生 ( 京ICP备07036130号 Powered by Discuz! X )

GMT+8, 2024-4-29 23:43