为何同一PHP脚本在InfinityFree与Awardspace主机表现不同?
解决您在Awardspace主机上的PHP脚本报错问题
咱们逐个拆解你遇到的问题,看起来是两个独立的问题导致了这些警告:
一、解决「Headers already sent」相关警告
这两个警告(session_start()的缓存限制器错误和后面的header()跳转错误)根源完全一致:在PHP发送HTTP头信息之前,已经有内容输出到浏览器了。HTTP头必须在任何实际内容(包括空格、换行、HTML标签,甚至UTF-8文件的隐藏BOM标记)之前发送。
具体排查和修复步骤:
- 检查脚本第一行的
<?php:确保它是文件的第一个字符,前面没有任何空格、换行或者隐藏的BOM标记。很多编辑器默认会给UTF-8文件加BOM,你可以在编辑器设置里切换成「UTF-8 without BOM」编码。 - 确认
session_start();是脚本的第一行有效代码:不能在它之前用echo、print这类输出语句,也不能包含任何会输出内容的其他文件(比如include的文件里有HTML或者多余空格)。 - 尽量省略
?>标记:如果脚本末尾没有HTML内容,直接去掉?>可以避免标记后面的空行意外输出。
二、解决「file_get_contents连接被拒绝」的问题
这个错误说明Awardspace主机的环境阻止了脚本通过file_get_contents访问外部URL(ipinfo.io),大概率是主机禁用了allow_url_fopen配置,或者防火墙拦截了外部请求。
修复方案:
最稳妥的替代方案是用cURL替代file_get_contents——很多主机虽然禁用了前者,但会开放cURL功能。把第51-53行的代码替换成下面的cURL版本:
$ip = $_SERVER['REMOTE_ADDR']; // 初始化cURL会话 $ch = curl_init("http://ipinfo.io/{$ip}/json"); // 设置返回结果而非直接输出 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 执行请求并获取响应 $response = curl_exec($ch); // 关闭会话 curl_close($ch); // 解析JSON数据 $details = json_decode($response); $locationData = $details->city;
如果替换后还是无法连接,建议联系Awardspace客服,确认是否允许外部HTTP请求,或者是否需要配置特定的代理规则。
内容的提问来源于stack exchange,提问作者Peter




