2011-10-21 2 views
1

は、これはあなたのほとんどに愚かな質問のように見えるだろうが、私は行うことができない理由は、この:ファイル内なぜPythonができるときにContent-Type:text/htmlをテキストファイルに追加できないのですか?

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と印刷しています。

+0

もう1つはサーバー側CGIスクリプトですか?あなたはどのフレームワークを使用していますか? – Constantinius

+0

私はフレームワークを使用していません。これは純粋に私自身の好奇心のためであり、ヘッダーが実際にどのように機能するかは実際には決してありませんでした。 – MrMisterMan

+0

'file'ではなく' http'でファイルシステムにアクセスするようにブラウザを誘導することができます。 – robertc

答えて

4

HTTP応答は、最初に受信された\r\n\r\nで区切られたヘッダーと本文で構成されます。 Webサーバーが通常のファイルを送信するときには、既にすべてのヘッダーとセパレータが送信されています。
ただし、スクリプトを実行すると、ヘッダーは自動的に送信されません。

最初のケースでは、Webサーバーはファイルの内容を送信する前に、拡張子からcontent-typeを推測し、適切なヘッダーを送信しました。 2番目のスクリプトは、content-typeのオーバーライドヘッダーを送信しました。それは、他の標準的なhttpヘッダーを挿入するという点で、これをどのように処理するかは、Webサーバーに依存します。

EDIT: Apacheは、ファイル拡張子をContent-Typesにマップするためにmod_mineおよび/etc/mime.typesを使用します。おそらく、それが理解できる拡張子を持たないものに対しては、デフォルトでtext/plainになります。

ブラウザは、使用するContent-Typeを持たない場合にのみ、拡張機能を動作させる可能性があります。

プレーンファイルはデータだけを含むと見なされ、ヘッダーはWebサーバーによって生成されますが、cgiスクリプトは独自のヘッダーを生成することができます。

+0

ブラウザは、いつ拡張子からコンテンツタイプを推測することはありませんか?拡張は一切していませんでしたが、それをテキストファイルとして解釈しました。 httpd.confファイルで指定された特定のファイルを扱う方法に関する規則はありますか? – MrMisterMan

+0

ウェブサーバーの設定方法とテスト方法を教えてください。 –

+0

共有ホスティングアカウントでcpanelを使用しています。私はhttpd.confにアクセスできない。 .htaccessファイルには何も特別なものはありません。私は私の質問の中で私のサーバのルートと/ cgi-bin/Bareの両方に気づいたことを気にしてファイルをアップロードすることでテストしています。私は本当に何かを達成しようとしていません。サーバー/ヘッダーなどの理解を深めてください。 – MrMisterMan

3

ブラウザがファイルから直接読み込んだ場合、httpヘッダーは探していません。 Pythonスクリプトがブラウザのhttp要求に応答しているときは、それは異なっており、ブラウザは最初の行がhttpヘッダーであると期待しています。

+0

ヘッダーを探すかどうかはブラウザがどのように決定しますか?それは拡張から外れますか? – MrMisterMan

+1

@MrMisterManファイルをスクリプトとして実行するのか、それとも単にデータとして提供するのかをサーバーに知らせる構成があります。これは、それが入っているディレクトリか、ファイル拡張子です。そして、ブラウザではなくContent-Typeが何であるかを決めるのはサーバマシンです。 –

関連する問題