【问题标题】:Why can't I just add Content-Type:text/html to a text file when Python can?为什么我不能只将 Content-Type:text/html 添加到文本文件中,而 Python 可以?
【发布时间】:2011-12-12 09:01:47
【问题描述】:

这对你们大多数人来说似乎是一个愚蠢的问题,但为什么我不能这样做:

Content-Type:text/html

<html>
<head><title>Hello</title></head>
<body>
<h1>Hello, World!</h1>
</body>
</html>

在一个名为 test.txt 的文件中,当 Python 脚本可以执行此操作时,在我的浏览器中以 html 格式打开它:

#!/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

【问题讨论】:

  • 第二个是服务器端CGI脚本?你用的是什么框架?
  • 我没有使用任何框架。这纯粹是出于我自己的好奇心,我从来没有真正理解标题的实际工作方式。
  • 如果你能说服你的浏览器通过http而不是file访问文件系统,你就可以。

标签: python html http-headers


【解决方案1】:

当浏览器直接从文件中读取时,它们并不是在寻找 http 标头。当 python 脚本响应浏览器的 http 请求时,情况就不同了,浏览器希望第一行是 http 标头,然后它会按照您的预期进行解释。

【讨论】:

  • 浏览器如何决定是否查找标题?它会停止扩展吗?
  • @MrMisterMan 将有配置告诉服务器是将文件作为脚本运行,还是将其作为数据提供。这可以是它所在的目录,也可以是文件扩展名。决定 Content-Type 是什么的是服务器,而不是浏览器。
【解决方案2】:

HTTP 响应由标头和正文组成,由收到的第一个 \r\n\r\n 分隔。当网络服务器发送一个普通文件时,它已经发送了所有的文件头和分隔符。
但是,在运行脚本时,不会自动发送标头。

所以在第一种情况下,您的网络服务器在发送文件内容之前从扩展名中猜测了内容类型,并发送了适当的标头。在第二个中,脚本为内容类型发送了一个覆盖标头。然后由网络服务器决定如何处理这个问题,在插入其他标准 http 标头方面。

编辑: Apache 使用 mod_mine 和 /etc/mime.types 将文件扩展名映射到 Content-Types。对于没有它理解的扩展名的任何内容,它可能默认为 text/plain。

只有在没有 Content-Type 可供使用的情况下,浏览器才可能在扩展程序上工作。

假定普通文件仅包含数据,并且标头由 Web 服务器生成,而 cgi 脚本应/允许生成自己的标头。

【讨论】:

  • 浏览器何时从扩展中猜测内容类型?我根本没有尝试扩展,但它仍然将其解释为文本文件。 httpd.conf文件中是否规定了某些文件的处理规则?
  • 告诉我们更多关于您的网络服务器的设置和测试方式。
  • 我在共享主机帐户上使用 cpanel。我无权访问 httpd.conf。我的 .htaccess 文件没有什么特别之处。我正在通过将您在我的问题中看到的文件上传到服务器的根目录和 /cgi-bin/ Bare 来进行测试,我并没有真正尝试实现任何目标,这纯粹是出于我自己的好奇心和更好地理解服务器/标头等...
  • 谢谢您,我没有其他问题了。
猜你喜欢
  • 1970-01-01
  • 2014-12-10
  • 1970-01-01
  • 1970-01-01
  • 2014-02-14
  • 2021-06-03
  • 1970-01-01
  • 2011-12-14
  • 1970-01-01
相关资源
最近更新 更多