PHP:UTF-8 BOM 会导致 HTTP 头的发送

如题,PHP Warning 奇遇记: Cannot modify header information – headers already sent

用 Notepad++ 写 PHP 代码不小心踩中一颗地雷。即使代码看起来是这样


运行起来仍然会产生

Warning: Cannot modify header information - headers already sent by (output started at E:\test.php:1) in E:\test.php on line 2

而不管是用 curl 命令还是浏览器,看到HTTP消息正文都是空的。(PHP/5.3.10, PHP/5.3.29, nginx/1.4.4, Apache/2.2.21, libcurl/7.40.0)


真是怪了。第 1 行真的输出了什么奇怪的东西?在 Notepad++ 显示不可见字符,一无所获。一拍脑袋,用 UltraEdit 十六进制视图观察了一下。前三个字节映入眼帘,

0xEF 0xBB 0xBF

和传说中的“锟斤拷”简直神似……豁然开朗!于是回到 Notepad++,将编码格式由 “UTF-8” 改为 “UTF-8 无 BOM” ,问题排除。

(完)

WordPress 只对搜索引擎进行 301 重定向

一个网站多个域名的情况很常见,但对SEO有严重影响。本文提供的代码可对 WordPress 全站进行 301 重定向,但只对搜索引擎爬虫生效。

一个网站多个域名的情况非常常见,比如本站有 SAE 提供的二级域名 200404.sinaapp.com,还有我自己注册的 www.200404.xyz,此外 200404.xyz 也被解析到本站。这种情况可能使搜索引擎认为网站有作弊嫌疑,而降低权重、减少索引量。解决办法是添加 301 重定向。

我这里的需求比较特殊,我希望把搜索引擎引到 200404.sinaapp.com 去,同时让用户还能很好地直接通过 www.200404.xyz 访问。

我们修改 /index.php,在其头部加上以下代码。您要使用时只需修改第三行,改为您的主域名。


对搜索引擎的识别是在 user-agent 字串中查找 'spider' 或 'bot' 关键词,这对主流搜索引擎的爬虫均有效。

以下是使用 curl 命令进行测试的效果。

C:\Users\Justin>curl localhost/?p=105 --user-agent chrome --head
HTTP/1.1 200 OK
Date: Tue, 10 Feb 2015 04:18:41 GMT
Server: Apache/2.2.21 (Win32) PHP/5.3.10
X-Powered-By: PHP/5.3.10
Content-Type: text/html


C:\Users\Justin>curl localhost/?p=105 --user-agent baiduspider --head
HTTP/1.1 301 Moved Permanently
Date: Tue, 10 Feb 2015 04:18:49 GMT
Server: Apache/2.2.21 (Win32) PHP/5.3.10
X-Powered-By: PHP/5.3.10
Location: http://200404.sinaapp.com/?p=105
Content-Type: text/html

(完)