• ベストアンサー

Content-Typeの判別

今、CGIのプログラムを作成中なのですが、クライアントから送られてきたデータのContent-Typeを判別するには、どのようにすればよいのですか? if($ENV{'CONTENT_TYPE'} =~ s/^content-type:(\s)text/i){ #処理 } こんな感じですか?以上のようにやってみたのですが、うまく動きませんでした。

  • CGI
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

POST メソッドでリクエストの場合はクライアントからもContent-typeが送られます。 普通のPOSTは Content-Type=application/x-www-form-urlencoded ファイルアップロードでenctype="multipart/form-data"が指定されている場合は Content-Type=multipart/form-data が送られます。 実際の処理はライブラリ(cgi-lib.pl)やモジュール(CGI.pm)使ったほうが便利ですね

その他の回答 (1)

noname#25358
noname#25358
回答No.1

 通常のCGIの場合、クライアントは Content-type ヘッダを渡してきません。  それは、あなた(サーバー)がクライアントに返すべきヘッダの1つです。  具体的に何がしたいのか、もうちょっと詳しく補足してみてください。

pakoten
質問者

お礼

素早い回答ありがとうございました。

pakoten
質問者

補足

本来は、変換プログラム(CGI)にWWWコンテンツを渡し、その変換結果を受け取るというperlプログラムを作るのが目的です。 ですが、最初なので、まずCGIの仕組みから勉強しました。例えば、CGIはMETHODがPOSTかGETを判断ため、どういった処理が行われているのか、また、文字コードやヘッダをどう解釈しているか理解しました。 こうすることにより、どのようにしてCGIにヘッダやら文字コード情報を送ればよいのか分かると思ったからです。 環境変数により、解釈しているのは大体分かったのですが、文字コード変換とContent-Typeについては未だよくわかりません。 そこで、こちらでお聞きしたわけです。

関連するQ&A

  • Content-type: text/htmlが表示されてしまう

    PerlでCGIを作成しております。 海外のサーバーでCGIをアップしたところなぜかすべてのCGIで Content-type: text/html がページ上部に表示されてしまいます。 そのファイルは日本のサーバーでは問題なく動作しております。 print "Content-type: text/html\n\n"; print "<html><head><title>$site_title</title></head>\n"; 上のようにプログラムは書いております。 これは言語に依存するのですか? ご教示お願いします。

  • perl CGIでのhttpヘッダー出力 (Content-type:

    perl CGIでのhttpヘッダー出力 (Content-type: text/html\n\n) が不要な場合について perlでCGIを作成しています。 多くの場合は、httpのヘッダー出力(Content-type: text/html\n\)を行っています。 毎回ではないですが、HTTPヘッダーの出力が不要な場合が存在します。 (HTMLにContent-type: text/html\n\が出力され表示されます。) そこで、HTTPヘッダーの出力が不要の場合の判断方法を教えていただければと思います。 よろしくお願いいたします。

  • Content-type: を切り替える方法

    cgi で、 print "Content-type: text/html\n\n"; で、テキストやINPUT タグ等を表示した後、  print "Content-type: image/jpg\n\n"; で、Content-type を切り替えて画像を表示させ たいのですが、画像イメージがどうもテキストと 認識されるらしく、文字化けのテキストがずらずらっと表示されます。  上の順序を逆にすると今度は画像は表示されるものの、テキスト、タグが表示されなくなります。 どう書けば、両方の表示に対応できるようになるでしょうか。

  • content-typeヘッダを先に出力してもいいでしょうか?

    SSIでCGIを呼び出し、ひととおりの処理をして最後にcontent-typeヘッダを出力しています。 アクセス解析用の環境変数を取得するだけで、ページ上には何も表示しない(ブラウザに何も返す必要がない)場合、  print "content-type: text/html\n\n";  print ""; としていますが、これを先に出力してもいいものでしょうか? ヘッダを先に出力してしまえば、その後スクリプトで時間がかかる処理をしても、ブラウザの「待ち時間」を最小にできるのではないかと思うのですが。

    • ベストアンサー
    • Perl
  • 標準入力からデータが読込めない

    現在perlにてcgiを作成しています。 以下のようなcgiを作成したのですが、POSTで受取ったデータが 標準入力より取得できません。 解決策、又は、調査方法等ご存知の方いらっしゃいましたら教えてください。 --------- a.cgi -------- #!/usr/bin/perl print "Content-type: text/html\n\n"; if( $ENV{'REQUEST_METHOD'} eq "POST" ){ read( STDIN, $buffer, $ENV{'CONTENT_LENGTH'} ); }else{ $buffer = $ENV{'QUERY_STRING' }; } print <<"HTML"; <HTML><HEAD><TITLE>テスト</TITLE> <META http-equiv=Content-Type content="text/html;"> </HEAD> <BODY> <FORM id=Form1 name=Form1 action=a.cgi method=post> HTML print <<"HTML"; <INPUT type=hidden value=aaa name=text1> <INPUT onclick="return confirm('送信します。よろしいですか?');" type=submit value=送信 name=Button1> </FORM> </BODY> </HTML> HTML exit; -------------------------------------------------- $ENV{'REQUEST_METHOD'} は POST を取得できていますし、 $ENV{'CONTENT_LENGTH'} も文字数は取得できています。 どうか宜しくお願い致します。

    • ベストアンサー
    • Perl
  • Content-Typeのcase-insensitive

    ちょっとCGIと外れるかも知れませんが、 RFC2045の11ページ目によるとContent-Typeヘッダは content := "Content-Type" ":" type "/" subtype         *(";" parameter)         ; Matching of media type and subtype         ; is ALWAYS case-insensitive. と定義されていますが、 "Content-Type"の部分は大文字小文字の区別はあるのでしょうか? 解説サイトなどでは、よく、Content-typeと書かれている所を見かけますし、 RFC2045内のサンプルもContent-typeと書かれていますから。 RFC2045を別のRFCで上書きされてるかとも思いまして。 Content-Typeだけでなく、Content-Dispositionやそれ以外のヘッダも関係すると思いますが。。。 もしcase-insensitiveなら、Content-typeがありContent-Typeがない場合はデフォルトのtext/plainではなく、Content-typeの指定で受けなければならないですよね。 本来はcase-sensitiveだけど、現実的にはバラバラだからcase-insensitiveをサポートしろって感じもしますが(^^; http://www.ietf.org/rfc/rfc1049.txt http://www.ietf.org/rfc/rfc2045.txt http://www.ietf.org/rfc/rfc2231.txt

    • ベストアンサー
    • CGI
  • 画面にContent-type:text/html

    現在CGIで掲示板を作ろうと思ってます。 改造してたところ、Content-type: text/htmlが画面いっぱいに表示されるエラーが出てきました; サーバー上だと最後はエラー落ちしてます。 これは何処かでループ処理が入ってしまっているせいなのでしょうか? 文法エラーも特に見当たりません。 改造元のCGIはhttp://a-cafe.com/cgi/ スキン式アップロード返信掲示板(ICONA-SKIN-UP-RES-BOARD(06.08/16))です。 改造前と改造後の差分になります:http://hoshinofuruoka.soragoto.net/FileDiff.html 改造部分は記入内容を増やし、レスとクッキーと時間挿入、連続投稿制限機能を廃止等です。 後、メール通知の処理も消してあります。 助言どうか宜しくお願いします。

  • "Content-type:text/html;charset=shift_JIS\n\n" がテキスト表示されてしまう。

    CGIで print "Content-type:text/html;charset=shift_JIS\n\n"; を出力すると その文字列がそのままブラウザにテキスト表示され、その後ろの操作、 例えば、 print "Status: 301 Move Permanent\n"; print "Location: http://localhost/file/data-1.lzh\n\n"; も、単純に文字列として表示されてしまいます。 ところが、print "Content-type:text/html;charset=shift_JIS\n\n"; の行を削除すると、 もともとの目的の動作(上記の例ではファイルのダウンロード画面ポップアップ)になります。 このように、print "Content-type:text/html;charset=shift_JIS\n\n";を書かなくて済む (あるいは書かない方が良い場合)というのは、なぜでしょうか。 サーバによっては動作が変わるのでしょうか。 ※そのCGI内で、print "Content-type:text/html;charset=shift_JIS\n\n"; を2行書いてあるというようなことはありません。 よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • CGIの中で異なるContent-typeのファイルを・・・。

    CGIでの処理で、今 http://xxxx.com/ok.cgi?id=123&pass=abc&page=index.html でindex.html が表示されているとします。 それで、このindex.htmlから別の拡張子のファイルへリンクさせ、ファイルをダウンロードできるようにしたいと思っています。lzh ならURLはこん感じになります。 http://xxxx.com/ok.cgi?id=123&pass=abc&page=sample.lzh  しかし ok.cgi の最後で print "Content-type: text/html\n"; exit; を指定しているのでリンク先へ行ってもindex.htmlは表示されますが、リンク先のファイルは動きません。 どうすればダウンロード出来るようになるでしょうか? なるべくこのok.cgi の外に出したくないのです。  また、この中で、リンク先が隠れるphpを入れたいと考えましたが、phpも同様に機能しません。これもどのようにすればよろしいでしょうか?  どなたかよろしくお願い致します。

    • ベストアンサー
    • Perl
  • iモードのcontent-lengthって??

    iモードのサイトを試しに作ってみたいのですが、 右記URL内中段にこのような記述がございました。http://www.nttdocomo.co.jp/service/imode/make/content/html/outline/s3.html 『CGI作成時に「Content-Type」、「Content-Length」は必須項目となります。』 また、違うサイトでは、 『サーバでは「Content-Length」の対応を必須としてください。万が一」、「Content-Length」のレスポンスを返さない場合、N902iX以降の端末では、500KB以上のコンテンツのDLが出来なくなります。』 とあります。 この 『「Content-Length」の対応』というのは、DLしている時に『現在何MBのファイルをDLしたか』というのを 画面上に表示させるためのものでしょうか? また、それ以前に、Content-Lengthというのは単純にファイルのサイズを記述しておけば良いのでしょうか? 分かる方、お願い致します!

    • ベストアンサー
    • HTML

専門家に質問してみよう