为什么我不能像Python那样给文本文件添加Content-Type:text/html?
这对大多数人来说可能是个傻问题,但我想问,为什么我不能这样做:
Content-Type:text/html
<html>
<head><title>Hello</title></head>
<body>
<h1>Hello, World!</h1>
</body>
</html>
把它放在一个叫做 test.txt
的文件里,然后在浏览器中以 HTML 格式打开,而 Python 脚本却可以这样做:
#!/usr/bin/python
print "Content-type:text/html\r\n\r\n"
print '<html>'
print '<head>'
print '<title>Hello Word - First CGI Program</title>'
print '</head>'
print '<body>'
print '<h2>Hello Word! This is my first CGI program</h2>'
print '</body>'
print '</html>'
而且一切都运行得很好。我看不出有什么区别,它们在浏览器请求的信息顶部都打印了 Content-Type:text/html
。
2 个回答
3
当浏览器直接从文件中读取内容时,它并不会关注http头信息。而当一个Python脚本在回应浏览器的http请求时,就不一样了。此时,浏览器会期待接收到的第一行内容是http头信息,然后它会按照预期来理解这些信息。
4
一个HTTP响应由头部和主体组成,它们之间用第一个\r\n\r\n
来分隔。当一个网页服务器发送普通文件时,它已经发送了所有的头部和分隔符。
但是,当运行一个脚本时,头部不会自动发送。
在第一个情况下,你的网页服务器根据文件的扩展名猜测了内容类型,并在发送文件内容之前发送了合适的头部。而在第二种情况下,脚本发送了一个覆盖的内容类型头部。接下来就看网页服务器如何处理这个头部,决定是否插入其他标准的HTTP头部。
编辑: Apache使用mod_mine和/etc/mime.types来将文件扩展名映射到内容类型。如果它遇到不认识的扩展名,可能会默认使用text/plain。
如果浏览器没有可用的内容类型,它可能只根据扩展名来判断。
普通文件被认为只包含数据,头部由网页服务器生成,而cgi脚本则被期望/允许生成自己的头部。