wordpress错误301问题跟踪

今天Hostker的运维人员在对内网进行调整,给squid增加公网备用IP线路。在设置到其中一台节点时遇到了一个很意外的情况。

首页和任意URL(静态除外)出现如下的301:

HTTP/1.1 301 Moved Permanently
Date: Mon, 28 Jul 2014 16:27:33 GMT
Server: Apache/2.4.9 (Unix)
X-Pingback: http://xinwo.acg.ac/xmlrpc.php
Expires: Wed, 11 Jan 1984 05:00:00 GMT
Cache-Control: no-cache, must-revalidate, max-age=0
Pragma: no-cache
Location: http://xinwo.acg.achttp/xinwo.acg.ac
CpuTime: 224
QueryTime: 10804
Connection: close
Content-Type: text/html; charset=UTF-8

所有WP主机都有这种情况,并且仅出现在一台squid上,线上的squid全部正常。此时把问题定到后端,在后端执行curl -I xinwo.acg.ac -x10.*.*.*:*(内网打码)之后还是出现301。此时心头万千草泥马奔过...难道是Apache哪里错了?可是最近没有改任何配置啊?

只能盲目debug了,打印出整个$_SERVER进行分析,没发现异常。下一步该怎么办?

在思考思路的时候运维比我先察觉到accesslog的异常情况,里面居然没有HOST头?(Hostker的Log格式与标准日志不同,标准日志没有HOST头,Hostker为了区分不同主机用户必需加上。)

再去检查有问题的squid配置,果然是没发送HOST头,修改配置文件让squid加上HOST头问题解决。但是不能就此作罢,还需要继续追查。

于是我们又做了一些实验,发现WordPress在HTTP的header没有HOST的情况下,确实会做出错误的301重定向。

具体的判断代码如下(位于wp-include/ms-settings.php 29行起):
[php]
$domain = strtolower( stripslashes( $_SERVER['HTTP_HOST'] ) );
if ( substr( $domain, -3 ) == ':80' ) {
$domain = substr( $domain, 0, -3 );
$_SERVER['HTTP_HOST'] = substr( $_SERVER['HTTP_HOST'], 0, -3 );
} elseif ( substr( $domain, -4 ) == ':443' ) {
$domain = substr( $domain, 0, -4 );
$_SERVER['HTTP_HOST'] = substr( $_SERVER['HTTP_HOST'], 0, -4 );
}
[/php]

如果继续判断SERVER_NAME来确定域名,则不会有这个问题。这算不算WordPress的Bug呢?

顺带一提,目前发现该问题似乎只存在于3.9上。旧版似乎无影响。

wordpress错误301问题跟踪 有 8 个评论

  1. 千与琥珀

    于是乎,守护女又妥妥的兴奋了一晚上……

    看代码看不出这段有什么BUG来,是判断有木有带端口然后分离出主域名的,没host头过来的话这两个if不起作用$domain是空输出,与数据库的设定值比对不同形成301跳转,跳转的值是设定的域名(不过我记得wordpress已经考虑了$domain和$_SERVER[‘HTTP_HOST’]是空的情况了

    就是搞不懂它为什么会搞成这样
    Location: http://xinwo.acg.achttp/xinwo.acg.ac

    1. 小新喵 回复 千与琥珀

      如果$domain为空,就进行Location,那部分代码没贴出来

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据