typecho重新升级至1.2.0(实际上是重新删除后安装)后,typecho始终无法登录后台。
PHP这种Web编程语言实在没接触过,花了两天来玩一下。
博客网站使用的技术:nginx+php-fpm+typecho(sqlite),nginx与php实际运行一个ARM电视盒子上。
正常运行的网站,各种调试、日志都是关闭的,因此,首先打开php-fpm的日志捕获开关:
;catch_workers_output=no
修改为yes,并将首字符;去掉。
此开关打开后,php的error_log就可以输出信息了。
同时将php.ini的显示错误开关打开:
;display_errors=off
修改为display_errors=on。
修改好这些开关后,重启php-fpm的服务。
之后就可以在typecho的php代码中增加error_log以观察代码的运行轨迹。
登录链接代码在typecho的admin目录login.php,但实际提交的代码为:
https://XXX.XXX.net/blog/index.php/action/login?_=7cf73d0584c577c96833bd2e3a58e0f0
_=后面的字符为一串md5字符,可以不管。
而这个链接首先会被nginx的fastcgi_split_path_info功能拆分,对于blog的fastcgi_split_path_info代码如下:
fastcgi_split_path_info后面的正则表达式,将/blog/index.php/action/login?_=7cf73d0584c577c96833bd2e3a58e0f0链接拆分成两个group
分别是:
/blog/index.php
与
/action/login?_=7cf73d0584c577c96833bd2e3a58e0f0
然后用$fastcgi_script_name与$fastcgi_path_info存放。
在其后的
将后部内容传递至PATH_INFO(这个变量在typecho中,即可通过从request头部中获取PATH_INFO变量来取得)
实际执行脚本的是/blog/index.php
但从index.php来看,代码很简单:
从网络中,搜索一堆资料,了解到,关键代码在TypechoRouter::dispatch()
主要内容即根据数据库中的路由表,分别调用创建对应的Widget,然后调用相应Widget的action函数。
在Router.php的dispatch函数中加上相应的日志输出对应的widget。
从日志看出/action/login?_=7cf73d0584c577c96833bd2e3a58e0f0对应的widget为WidgetAction
对于varWidgetAction.php的代码见内:
基本思想来看,查map表,然后转到对应的类。对于当前动作,login显然对应到WidgetLogin.php。
WidgetLogin.php的代码如下:
在此action函数中,加上相应日志,问题定位到此处代码:
代码在执行到此行,即已经返回,也就根本没有再执行后面的校验用户名、密码等动作。
protect函数的代码如下,相当简单
在此函数中加上日志定位到,此处的request->get('_')获取即为请求中的7cf73d0584c577c96833bd2e3a58e0f0,
而getToken函数如下:
根据token与request的getReferer计算的一个md5内容。
token及相应计算规则应该是没有问题的,因此怀疑点定位到getReferer函数的返回内容。
在网上搜索一番后,发现已经有人记录了此种问题及相应解决办法,链接:https://blog.warhut.cn/dmbj/423.html
引用如下:
------------------------------------------------------------------------------------------------------------------
如果加入了,将会导致无法登录后台,原因如下:
由于是通过登录的后台地址,传输参数,所以当加入之后相当于删除了提交的地址。
通过下面即可解决,加在中。
------------------------------------------------------------------------------------------------------------------
解决办法,先在adminHeader.php中加入上面的referer行,如下:
加入后,登录功能即正常,但blog首页中的退出登录还有问题,点击退出类似于登录异常的情形,直接返回。
采取在首页相应的header处,添加相应代码。
themes中的header.php中代码如下(默认theme):
这儿首页的header()函数,实际对应到var/Widget/Archive.php中的header函数,
即可解决首页退出登录情况。