这个问题搞了我两个小时,我头快晕死了。
趁着改网站首页的时间,把服务端博客平台升级了一下,现在博客是最新版WordPress 5.9.3 + PHP 8.1的环境。
一开始换上新的PHP环境时,点开博客直接500。
在这期间,肯定还是解决了一些问题的,多少都是修改配置就能解决,然而,还是遇到了一个比较奇葩又难搞的问题。
具体表现是其它的php页面能访问,唯独WordPress不能进,直接报500错误,这还不是最主要的,问题是我连错误都不知道在哪找,哪怕我在IIS里开启了log模式,PHP的配置文件打开错误记录,什么都抓不到。
正当我头疼棘手的时候,我想起来WordPress自带debug功能。
可以,我觉得非常好,打开后:
果然,是兼容性问题,禁用这个插件网站就不崩溃了,但是这个插件可是IIS平台必备(没错我就是不喜欢服务端用Linux)。
我拿着这个错误代码在网上查资料,没有相关的记载,可能是因为PHP版本太新了,而且官方文档里也没有提到7.x和8.x之间PATH_INFO的用法差异。就因为找这个资料,花了我两个多小时!!
我百思不得其解,打算直接进PHP示例页面去找。
!!!
(我姑且这样认为)PHP 8在IIS里已经不支持PATH_INFO的获取了,因此只有ORIG_PATH_INFO的存在,那我该怎么办呢?现有的这个变量获取到的地址是包含index.php的。
没关系,聪明的你一定用过URL重写的对吗?如果你正确配置了URL重写, 实际上是可以规避这个问题的,它获取到的参数仍然跟PATH_INFO相同。
因此,我们只需要对这个插件做个修改,加个判断参数。
// iis encode the url with GBK,but wordpress with utf-8
function bossma_get_urf8_pathandurl() {
//在这里加上判断参数,如果未获取到PATH_INFO,则用ORIG_PATH_INFO代替
if ( !isset($_SERVER['PATH_INFO']) && isset($_SERVER['ORIG_PATH_INFO']) )
$_SERVER['PATH_INFO'] = $_SERVER['ORIG_PATH_INFO'];
$_SERVER['PATH_INFO']=iconv("GBK","UTF-8",$_SERVER['PATH_INFO']);
$_SERVER['REQUEST_URI']=iconv("GBK","UTF-8",$_SERVER['REQUEST_URI']);
}
完成,不再报错了!带中文链接的页面也能正常访问。