You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何PHP CGI脚本可直接返回完整HTML文档而Bash CGI脚本不行?

为何PHP CGI脚本可直接返回完整HTML文档而Bash CGI脚本不行?

其实这里有个小误解——你的Bash CGI脚本完全可以返回完整HTML文档,只是之前的写法没符合CGI规范而已! 咱们来拆解背后的逻辑:

先搞懂CGI的核心规则

Web服务器(比如Apache)和CGI脚本通信时,有个硬性要求:脚本必须先输出HTTP响应头,然后用一个空行和实际的内容(HTML、文本等)分隔开。其中Content-Type头是必须的,它告诉服务器返回内容的类型(比如text/html就是HTML文档)。

来看你的两个脚本

1. Bash脚本(Script 1)的问题

你现在的脚本代码里,HTTP头和HTML内容之间没有空行分隔:

#!/bin/bash

cat <<'EOF'
Status: 200 OK
Content-type: text/html
<p>Under construction.</p>
EOF

Apache会把Content-type行后面的<p>标签也当成HTTP头的一部分,自然会报错“无效头”。只要调整一下,在Content-type后面加一个空行,就能正常返回完整HTML了,比如:

#!/bin/bash

cat <<'EOF'
Status: 200 OK
Content-type: text/html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Bash CGI测试</title>
</head>
<body>
    <h1>这是Bash返回的完整HTML页面</h1>
    <p>Under construction.</p>
</body>
</html>
EOF

这样写就完全符合CGI规范,Apache能正确识别头和内容,自然就能正常返回完整HTML了。

2. PHP脚本(Script 2)为啥能直接写HTML?

你用CLI版本的PHP(比如php test2.php)运行时,输出确实只有HTML,但Apache调用的是PHP的CGI版本(比如php-cgi)。这个版本会自动帮我们补全必要的HTTP头和分隔空行!

比如你在终端运行php-cgi test2.php,输出会是这样:

Content-type: text/html; charset=UTF-8

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
...etc
</head>
<body>
...etc
</body>
</html>

看到没?CGI版本的PHP自动帮我们加了Content-Type头,还补了分隔用的空行,完全符合CGI规范,所以Apache能正确处理,返回完整HTML文档。

总结一下

  • 不管是Bash还是PHP的CGI脚本,都得遵守CGI规范:先输出HTTP头(至少Content-Type),空行分隔,再输出内容。
  • Bash脚本需要手动写全头信息和空行,只要做到这点,就能返回完整HTML。
  • PHP的CGI版本会自动生成必要的HTTP头和分隔空行,所以你只需要专注写HTML内容就行。

备注:内容来源于stack exchange,提问作者QF0

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 07:57:58