`
baiyuxiong
  • 浏览: 174828 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

【转载】分析WordPress的Rewrite机制

阅读更多
http://www.black-xstar.com/blog/546.html

于我的新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 文件,其中有一段如下

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
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最主要的,因此我们将对象实例化

$wp_the_query =& new WP_Query();
$wp_query     =& $wp_the_query;
$wp_rewrite   =& new WP_Rewrite();
$wp           =& new WP();

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

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

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

[wp-feed.php$] => index.php?feed=feed
[wp-commentsrss2.php$] => index.php?feed=rss2&withcomments=1
[(about)/trackback/?$] => index.php?pagename=$matches[1]&tb=1
[page/?([0-9]{1,})/?$] => index.php?&paged=$matches[1]
[comments/(feed|rdf|rss|rss2|atom)/?$] => index.php?&feed=$matches[1]&withcomments=1
[search/(.+)/?$] => index.php?s=$matches[1]
[category/(.+?)/?$] => index.php?category_name=$matches[1]
[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
分享到:
评论

相关推荐

    WordPressURLRewrite1.1WP伪静态重写组件

    简单的WordPress URL重写WordPress URL Rewrite!点击“下载”按钮开始使用WordPress URL重写。 WordPress URL重写与这些版本的Windows: Windows 8,7和Vista(32位和64位) Windows XP(见下面的特殊要求) ...

    wordpress nginx多站点rewrite(重写)规则

    wordpress多站点模式可以被应用在多种方式上。其中最常用的是在”子目录”模式或者”二级域名”模式上。 Nginx提供了两种特殊的指令:”x-accel-redirect”和”map”,使用这两个指令可以使得wordpress多站点的网络...

    iis_rewrite.zip

    下面分别介绍记事狗系统在IIS 服务器下的Rewrite设置方法(Apache服务器默认即可支持): 一、路径模式; 1、php中默认均开启了Rewrite模块,通常来说iis服务器也不需要额外的设置; 2、进入记事狗系统后台->...

    IIS%2bWordPress利用UrlRewrite实现永久链接-Permanent-Links-的完美方案

    IIS%2bWordPress利用UrlRewrite实现永久链接-Permanent-Links-的完美方案

    ISAPI_Rewrite3_0056.msi

    Wordpress也对此功能提供支持,在”设置-永久链接”中我们可以自定义永久链接结构。不过这一切都是基于mod_rewrite,难道IIS只能干瞪眼?不争气的.net! 其实IIS中也能实现伪静态URL。虽然没有mod_rewrite,但是有...

    IIS rewrite

    iis rewrite 的 url 的常用文件

    Rewrite程序端

    Rewrite程序端Rewrite程序端Rewrite程序端Rewrite程序端Rewrite程序端Rewrite程序端

    Nginx URL重写rewrite机制原理及使用实例

    Nginx URL重写(rewrite)介绍 和apache等web服务软件一样,rewrite的组要功能是实现RUL地址的重定向。Nginx的rewrite功能需要PCRE软件的支持,即通过perl兼容正则表达式语句进行规则匹配的。默认参数编译nginx就会...

    netcn_URLRewrite

    什么是UrlRewrite UrlRewrite 是 将动态页面转换为静态页面的一种技术 例如 您网站页面是 http: www yourdomain com news docread aspx id 123 为什么使用UrlRewrite: 1 处理这样的情形:你要更改你的web应用...

    urlrewrite

    urlrewrite

    打造UrlRewrite源码

    打造UrlRewrite源码 UrlRewrite一般都是在web.config里配置访问规则在路由到实际页面,所以先实现自定义节点信息读取,这里我定义了俩个类 webconfig定义了组,不需要的话可以把UrlRewriteConfigGroup类去掉并修改...

    wordpress 网站建设源程序

    •启用 mod_rewrite 这一 Apache 模块。 •在您的站点设置至 http://cn.wordpress.org 的链接。 在线资源 若您遇上文档中未有提及的情况,请首先参考我们为您准备的丰富 WordPress 在线资源: WordPress Codex 文档...

    URL Rewrite.zip

    URL Rewrite是微软针对IIS推出的一种对URL进行重写的扩展模块,目前支持用于IIS7及以上版本。该模块使IIS管理员能够创建强大的自定义规则,语法支持正则规则以及通配符规则过滤。它能够根据HTTP头和IIS服务器变量...

    NohBoard-ReWrite-v1.3.0.zip

    NohBoard-ReWrite-v1.3.0.zip

    isapi_Rewrite 64

    ISAPI_Rewrite是一个功能强大的URL重写组件。它的功能类似Apache的mod_Rewrite ,但用于微软的Internet信息服务( IIS ) 。 ISAPI_Rewrite是一个ISAPI筛选器的书面纯的C / C + +所以速度极快。 ISAPI_Rewrite让您的...

    urlrewrite 支持自定义多配置文件

    在网上找了很多都不合心意,就知道改了下源码,只改了org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.class 文件,如果担心安全的朋友,可以下载 4.0.3的jar 替换UrlRewriteFilter.class即可。 confPath 默认 ...

    ISAPI_Rewrite3_full完全版及绿色版

    2、在将Rewrite破解文件夹中的dll文件覆盖到程序安装目录下ISAPI_Rewrite.dll和ISAPI_RewriteSnapin.dll,如果提示在使用则把要覆盖的dll文件重命名在复制即可; 3、打开安装目录下的httpd.conf文件,在里面输入...

    URLrewrite-实例

    java urlrewrite demo

    ISAPI_Rewrite2.9版(有注册码)

    ISAPI_Rewrite是一个功能强大的网址操纵发动机的基础上正则表达式。它的行为是像Apache的mod_Rewrite ,但专为微软的Internet信息服务( IIS ) 。 ISAPI_Rewrite是一个ISAPI筛选器的书面纯的C / C + +所以速度极快...

Global site tag (gtag.js) - Google Analytics