一个PHP程序,其中的header
语句不起作用
header("Location: login.php");
打开error_reporting(E_ALL)
,报错header之前已有数据送出。
Warning: Cannot modify header information - headers already sent by ...
调试的结果居然是由于文件的BOM(Byte Order Mark)引起的。
PHP源程序文件用的是UTF-8编码,UTF-8编码对应的BOM是EF BB BF
。
通过Fiddler观察到的结果是响应数据的开头有三组EF BB BF
。
用Vim打开文件,:set nobom
后,重新保存,问题解决。
如何找出所有包含BOM的文件并进行修正呢?
以UTF-8文件的BOM为例,
#!/bin/bash fgrep -rl -I $'\xEF\xBB\xBF' $dir ;# find UTF-8 BOM
"-r"指定递归搜索,"-l"指定只列出文件名,"-I"指定忽略binary文件。
需要说明的是上面的命令只对Bash Shell有用,C Shell下则有问题(不能识别转义字符)。
可以借助sed去掉BOM标记。
fgrep -rl -I $'\xEF\xBB\xBF' . | xargs sed -i 's/^\xEF\xBB\xBF//;q'
只是去掉文件开头的三个字符也可以用tail命令。
tail --bytes=+4 $file