wordpress是全球使用最广泛的博客程序,使用php搭建。
wp工作原理分析
在安装前,先把源码部署到服务器上,然后访问程序所在目录或其index.php,查看其源代码
<?php
/**
* Front to the WordPress application. This file doesn't do anything, but loads
* wp-blog-header.php which does and tells WordPress to load the theme.
*
* @package WordPress
*/
/**
* Tells WordPress to load the WordPress theme and output it.
*
* @var bool
*/
define( 'WP_USE_THEMES', true );
/** Loads the WordPress Environment and Template */
require __DIR__ . '/wp-blog-header.php';
发现加载 ./wp-blog-header.php,然后继续套娃,最终可以发现几点
- 判断是否存在wp-config.php,如果不存在,将开始配置wp
- 若已存在wp-config.php,说明已安装,那么我们通过删除此文件以重新安装
- 定义了很多目录,比如ABSPATH变量存储根目录,以及主题根目录变量等,以便被后期调用
- 编写文章时,记录了每一篇文章的ID,以及URI等信息到数据库
- 在用户访问时,通过伪静态方式,获得用户请求的URI,分析其URI是否匹配对应文章,若成功匹配,则返回文章页面
对很多新手来说,“伪静态”不好理解,通常我们访问index.php,它就真的存在一个index.php文件,这样一一对应的关系可以理解为“静态”,而我们访问123.html,实际并不存在这个123.html文件,那么这样是“伪静态”。
wordpress博客,默认使用PATH_INFO优化URL,主页面一般是index.php
例如URL,https://www.w3cschool.cn/php/php-arrays.html,想要验证此网站是否使用了PATH_INFO,那么输入在域名后输入index.php,将定位到同一个页面。即https://www.w3cschool.cn/index.php/php/php-arrays.html和没加/index.php是一致的。
在php中,可以使用 $_SERVER[‘PATH_INFO’]取得上述的参数,然后通过伪静态把index.php抹去,用户看不见index.php,以达到URL优化效果。
wp根目录伪静态
如果你没开启伪静态,那么将导致所有页面404,修改固定链接同样无效,仅主页能打开。
而wordpress博客,默认使用的就是上述原理,如果wordpress站点是根目录,那么易知其 nginx 伪静态规则如下:
# 匹配/目录下的wp
location /
{
try_files $uri $uri/ /index.php?$args;
}
# 所有wp后台
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
这里的 location /表示匹配所有URI,对其的规则写在{}中,而 try_files是rewrite的另一种方式,$uri表示URI本身,try_files后面的3个字段,表示首先匹配 / ,然后是 /下的资源, 再然后是 /index.php?参数
注释:nginx伪静态规则中的 $uri 表示请求的uri本身,而 $args表示参数,例如 index.php?$args表示重写url时保留参数
为了防止后台打不开,又使用了 rewrite 重写后台路径。
wp子目录伪静态
如果你的wordpress安装在子目录,那么易知它的伪静态规则是
# 匹配/wordpress/目录下的wp
location /wordpress/
{
try_files $uri $uri/ /wordpress/index.php?$args;
}
# 所有wp后台
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
需要注意,如果伪静态范围冲突,是会有先后顺序的,建议不要这么做,或者把子目录规则写在前。
自定义框架分析
通过使用伪静态规则,我们模仿wordpress设计一个简单框架
首先,编写伪静态规则
location /
{
try_files $uri $uri/ /index.php?page=$uri&$args;
}
# 防止后台登陆不上
rewrite /my-admin$ $scheme://$host$uri/ permanent;
我们编写一个index.php页面,作为程序的主控制逻辑,它会捕获非php页面,并把uri参数并传递到页面中,我们通过 $_GET[‘page’]就可以知道用户获取的是哪个html页面。
例如,访问 域名/1234.html?abc=bbb
var_dump($_GET);
array(2) { ["page"]=> string(10) "/1234.html" ["abc"]=> string(3) "bbb" }
我们能保留原重写前的参数,并增加一个uri作为page参数,更方便知道用户获取的页面。
在根目录下,新建一个 /my-admin 目录,这个目录不会重写URL规则,作为后台正常使用。
后台制作一个 markdown 编辑器,以编写文章,编写完毕生成一个uri并把它们保存到数据库中。
用户输入url,根据page参数匹配数据库,一旦找到合适数据,返回数据到页面,展示给用户。
一个简单的框架就这样完成了,当然可以增加许多功能,比如文章搜索等,这里不做讨论。
本篇完,还有疑问?留下评论吧