MacOS Big Sur下新建Perl脚本运行报Internal Server Error问题
Perl CGI脚本复制后Internal Server Error问题排查
End of script output before headers报错本质是脚本执行过程中没有输出任何HTTP头就提前终止,Web服务器无法返回合法响应,具体诱因排查如下:
1. 行尾符格式错误(最高概率)
- 你用BBEdit编辑、Fetch传输时,可能意外将脚本的行尾符从Unix格式的
LF转为了Windows格式的CRLF - Shebang行
#!/usr/bin/perl末尾如果带了\r字符,系统会尝试查找/usr/bin/perl\r这个不存在的解释器,脚本直接执行失败,无任何输出,触发报错 - 排查方法:终端执行
cat -v 你的脚本名,如果每行末尾出现^M符号,就是行尾符问题,用dos2unix 脚本名或者在BBEdit底部状态栏把行尾符改为Unix(LF)后重新保存即可
2. MacOS扩展属性隔离
- 新创建/复制的文件会默认被MacOS添加
com.apple.quarantine隔离扩展属性,Web服务器进程没有权限读取执行带该属性的文件 - 排查方法:终端执行
xattr -l 你的脚本名,如果输出里有com.apple.quarantine字段,执行xattr -d com.apple.quarantine 你的脚本名删除该属性即可
3. 脚本存在不可见前置字符
- BBEdit保存时如果选择了带BOM的UTF-8格式,UTF-8 BOM会出现在Shebang行之前,导致系统无法识别Shebang声明,脚本执行失败
- 排查方法:终端执行
hexdump -C 你的脚本名 | head -n 1,如果开头是ef bb bf 23 21,说明存在BOM头,在BBEdit的保存选项里关闭BOM即可
4. Web服务器执行权限匹配问题
- 你新增的带
_n后缀的文件,可能没有匹配到Web服务器配置里的CGI执行规则,比如部分配置只允许后缀为.cgi/.pl的文件执行,如果你修改后的文件名不符合规则,也会触发执行失败 - 排查方法:对比原有正常脚本和新脚本的完整文件名,检查Apache/Nginx的配置文件中
ScriptAlias/<Directory>段的CGI执行规则
内容的提问来源于stack exchange,提问作者heimi
相关产品推荐
相关产品推荐

