使用EventSource触发MIME类型错误,请求排查问题原因
以下是几个可能导致该问题的原因及对应解决办法:
文件名拼写不一致
你的PHP文件名是sse-test.php,但前端EventSource调用的是sse_test.php(中横线与下划线的区别)。fetch请求的是正确的/sse-test.php,所以能拿到正确响应头,但EventSource请求的是错误文件,服务器返回404页面(MIME类型为text/html),从而触发报错。
解决:将EventSource的路径改为sse-test.php,保持与文件名一致。PHP文件存在前置空白或BOM头
如果sse-test.php的<?php标签之前有空格、换行,或者文件带有UTF-8 BOM头,服务器会先输出这些空白字符,浏览器会将响应识别为text/html,即便后续设置了正确的Content-Type也无效。
解决:打开PHP文件,删除<?php之前的所有字符,保存为无BOM的UTF-8格式。PHP输出缓冲未关闭
若PHP的output_buffering配置处于开启状态,flush()无法立即输出内容,导致响应未按预期发送,服务器可能默认添加text/html的Content-Type。
解决:在PHP代码开头添加ob_end_clean();关闭输出缓冲:<?php ob_end_clean(); header("Content-type: text/event-stream"); header("Cache-Control: no-store"); $time = date('r'); echo "data: The server time is: {$time} "; flush(); ?>服务器配置覆盖了Content-Type
部分服务器(如Apache/Nginx)的默认配置可能强制为.php文件设置text/html的Content-Type,覆盖PHP脚本设置的header。
解决:检查服务器配置,确保允许PHP脚本自行设置Content-Type。比如在Apache的.htaccess中添加:<FilesMatch "\.php$"> Header unset Content-Type </FilesMatch>或在Nginx配置中移除强制设置Content-Type的相关指令。
内容的提问来源于stack exchange,提问作者Alex P

