• ベストアンサー

環境変数に文字列をセット?必須ヘッダ?

perlから環境変数にある文字列をセットしてcgiに送信するには、どのようにすればよいのですか? また、perlからcgiにデータを送る際、ヘッダはどのように書けばよいのでしょうか? 例えば、自分は(perl)はPOSTでContent-Typeはtext/plainだということをcgiに伝えるなど…。 また、ヘッダをcgiへ送る際、必須のヘッダは何があるのでしょうか? 初心者なので、くだらない質問ですいません。 よろしくお願いします。

  • Perl
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
回答No.2

長すぎなので回答を2つに分けました >また、ヘッダをcgiへ送る際、必須のヘッダは何があるのでしょうか? 下のサンプルから必須項目のみをピックアップします 例1. HTTP/1.0でGETで送る場合 print S "GET /~tarou/env.cgi HTTP/1.0\r\n\r\n";  # このように すごく単純ですね 例2. 同POSTで 送る場合 print S "POST /~tarou/env.cgi HTTP/1.0\r\n"; print S "Content-Length: $test_len\r\n\r\n";  # POSTの場合はContent-Lengthで送信バイト数が必要です 例3. HTTP/1.1 または 相手がネームベースのバーチャルサーバーの場合 print S "POST /~tarou/env.cgi HTTP/1.1\r\n"; print S "Host: umasika.com\r\n"; # この場合は Host情報が必須です print S "Content-Length: $test_len\r\n\r\n"; ######## あと、ついでに下のサンプルの変なところ  (このままで動くがちょっと変) print S "Host: umasika.com\r\n"; #これじゃあ折角$Srvにセットした意味無し print S "Host: $Srv\r\n"; # こうですね #print S "Content-type: application/x-www-form-urlencoded\r\n"; ↑勿論不要ですね(笑)

pakoten
質問者

お礼

早速、実行してみました。わざわざご丁寧にありがとうございました。

その他の回答 (1)

回答No.1

こういう事かな??と言うか下にサンプルを書くので設置して試してください #! /usr/bin/perl print"Content-type: text/html; charset=Shift_jis\n\n"; print"<html><body>\n"; print"<h1> [socketのTEST] </h1>\n\n"; print "<pre>\n"; print "http://$Srv$Uri から取得した値は -----\n\n "; $test_txt= "あいうえお \nおいらはumasika\n";# POSTで送る文字列 $test_len = length($test_txt);# それのバイト数 $Srv = 'umasika.com'; $Uri = "/~tarou/env.cgi"; $Ghb = (gethostbyname($Srv))[4]; $Con = pack("S n a4 x8", 2, 80, $Ghb); socket(S, 2, 1, 0); connect(S, $Con); binmode(S); select(S); $| = 1; select(stdout); # ここから空行までがリクエストヘッダ print S "POST $Uri HTTP/1.0\r\n";# リクエストヘッダの改行は\r\nである print S "User-Agent: hoge 5.0\r\n"; print S "Referer: http://hoge.com/hoge.htm\r\n"; print S "Connection: Keep-Alive\r\n"; print S "Host: umasika.com\r\n"; print S "Accept: image/gif, image/x-xbitmap, image/jpeg, */*\r\n"; print S "Content-type: text/plain\r\n"; #print S "Content-type: application/x-www-form-urlencoded\r\n"; print S "Content-Length: $test_len\r\n\r\n"; # ヘッダの終端なので空行も出力 print S "$test_txt"; print <S>; # 相手サーバーから返された文字列をそのまま出力 __END__ で受け取る側の http://umasika.com/~tarou/env.cgi は #! /usr/bin/perl print"Content-type: text/html; charset=Shift_jis\n\n"; print"<html><body>\n"; print"<h1> [環境変数のTEST] </h1><pre>\n"; print "\$0 = $0\n"; foreach(sort(keys %ENV)) {print" \$ENV{'$_'} = $ENV{$_} \n"; } ## form dataを受け取り そのままの形で出力 if($ENV{'REQUEST_METHOD'} eq "POST"){read(STDIN, $inputf, $ENV{'CONTENT_LENGTH'});} else{$inputf = $ENV{'QUERY_STRING'};} print "\$inputf = $inputf"; __END__ これでいろいろリクエストヘッダをいじるとどうなるかお試しください  (但し他人のサーバーで試すと怒られますよ)

関連するQ&A

  • 環境変数に任意の文字列をセット(代入)してcgiへ送るには?

    タイトル通りなのですが、環境変数に任意の文字列をセットしてcgiへそのセットした環境変数ごと送信するにはどうすればよいのでしょうか? 例えば、$ENV{'REQUEST_METHOD'}にABCとセットすれば、cgi側でREQUEST_METHODを参照するとABCが出てくるみたいな。(普通はPOSTやGETですが…) 環境変数を自由に設定できることは分かったのですが、いまいち設定の仕方が分かりません。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • gmailからwillcomへのemailにおける文字列について

    gmailからwillcomへメールを送ると本文の前に文字列が出るのですがこれはどうすれば消すことができるのでしょうか? gmailからwillcom、willcomからgmailに送ったtestとのみ入力した文章をコピーします。 ------=_Part_18502_15771748.1167620538812 Content-Type: text/plain; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline test ------=_Part_18502_15771748.1167620538812 Content-Type: text/html Content-Transfer-Encoding: 7bit Content-Disposition: inline test ------=_Part_18502_15771748.1167620538812-- ここの ------=_Part_18502_15771748.1167620538812 Content-Type: text/plain; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline という部分です。 これを抜いてtestという文章だけをメール送信するにはどうすればよいのでしょうか?

  • hotmailで返信したときに勝手に文字列が付け加えられるのは何?

    hotmailをよく利用しています。 メールの’返信’を使用したときに送信前には表示されないのに 本文の前に↓のような文字列が 勝手に追加されて送られる時があるようなのですが これは一体何でしょう? 追加しないよう設定できるのでしょうか? 条件がハッキリとはわからないのですが 一旦下書きに移動されてから送信すると付くようにも思います。 -----ここから------- <**********(よくわからない文字列)***********.gbl> Content-Type: text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: 7bit MIME-Version: 1.0 -----ここまで-------

  • 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ヘッダーの出力が不要の場合の判断方法を教えていただければと思います。 よろしくお願いいたします。

  • perl で環境変数を表示できない

    perlの初心者です。下記のCGIを実行しましたが、全く表示しません。 最初の「環境変数」と言う文字も表示しません。 どこか初歩的なエラーがあると思いますが、わかりませんので質問させていただきます。 --- #!/usr/local/bin/perl print "Content-type: text/html", "\n\n"; print "<HTML><BODY>", "\n"; print "<H1>環境変数</H1><HR>", "\n"; foreach my $key( keys %ENV ){ print "$key: $ENV{$key}<BR>", "\n"; } print "<HR>", "\n"; print "</BODY></HTML>", "\n";

    • ベストアンサー
    • Perl
  • 語尾に&submitという文字列が付加されてしまう

    OSはFreeBSD5.4です。 HTMLページ内で以下のフォームを使っています。 メールアドレスの文字列をformmail.cgiに渡すと 語尾に&submitという文字列が付加されてしまいます。 付加されないようにする方法を教えてください。 現在は空文字列に置換しています。 formmail.cgiの詳細が必要でしたらご指摘ください。 <form method="POST" action="cgi-bin/formmail.cgi"> メールアドレス:<input type="text" name="email"> <input type="submit" value="送信する"> </form>

    • ベストアンサー
    • CGI
  • sendmailの使えない環境でメールを送る

    いま使っている自分のサイトは CGI(Perl5)は OKですが sendmailが使えません。しかし、掲示板の書き込み内容をメールで送信したいと考えています。 で、幸いそのプロバイダには標準 CGIとしてメールデコードをサポートしています。これを巧く使ってメールを送信できないかとのご相談です。 件の CGIはPOSTメソッドで渡すので、CONTENT_LENGTHにその長さをセットし、標準入力へパラメータを。そして掲示板プログラムからメールでコードのCGIを呼び出せば巧くいきそうなのですが....。 1.まず、この方法は使えそうか? 2.perl中で別の CGIの標準入力へどのようにパラメータを渡すのか(パイプ?リダイレクト?) 3.環境変数 CONTENT_LENGTHへ CGI中から値を設定できるのか? 4.送信するパラメータはどんな文字列にすればいいのか?(エンコード、パラメータの区切りとか) 以上です。どなたかアドバイスお願いします

    • ベストアンサー
    • CGI
  • 予約システムの文字化け

    予約機能があるサイトをロリポップのサーバーで運営していましたが、この度、海外のbluehostに移転しました。サイトは問題なく表示が出来、予約も受け付けられるのですが、私が受け取る予約メールとご予約された方が受け取る確認メールが文字化けしてしまいます。サーバー運営者に質問したところ、CGIのヘッダーのエンコードをContent-Type: text/plain;charset=iso-8859-1にする必要があると言われたのですが、どの様に設定したらいいのか分かりません。CGI内を見たところConfirm DataとErrorにContent-type: text/html\n\nという文字を見つけたので、その個所をContent-Type: text/plain;charset=iso-8859-1に変えたりしてみたのですが、状況は悪化しました。どの様に設定すれば良いのか、分かる方がいらっしゃったら教えてください。よろしくお願いします。

    • 締切済み
    • CGI
  • 文字列の比較の仕方が分かりません

    フォームから入力された文字列をデータファイルの中から検索し、重複していなければ追加登録したい。 ・問題点 重複していても登録できてしまう。 昨日からperlを触り始めたばかりなので、基本的な部分が分かっておらず、 おかしい部分が多々あるかもしれませんが、ご指導よろしくお願い致します。 データは全て"["から始まるので、登録できませんの部分は、簡単な入力チェックです。 -------------------------------------------- test.html <html> <head> <meta http-equiv="Content-type" content="text/html; charset=UTF-8"> </head> <body> <form action="test2.cgi" method="post"> <input type="text" name="shirolist" size="50" /> <input type="submit" name="submit" value="送信" /> </form> </body> </html> -------------------------------------------- test2.cgi #!/usr/local/bin/perl use utf8; use CGI; $q = new CGI; $flag = 0; $data = $q -> param('shirolist'); $data =~ s/\s+//g; open(IN , "<:uft8" , "data.dat"); while($line=<IN>){ if ( $line eq $data ) { $flag = 1; } } close(IN); if($flag == 0){ if ($data =~ /^\[/) { open(OUT,">>data.dat"); print OUT "$data\n"; close(OUT); $pr="を登録しました"; } else { $pr="は登録できません"; } } else { $pr="は登録済みです"; } print "Content-Type: text/html; charset=UTF-8\n"; print "$data $pr<br>\n"; ※Yahoo知恵袋で同様の質問をしましたが、 回答者への個別のコメントや追加質問が出来ず、 非常に使いづらく感じたのでこちらに投稿させて頂きました。

    • ベストアンサー
    • Perl
  • CGIからCGIを、CGI環境変数付きで実行するには?

    CGI(Perl)からCGI(Perl)を実行してその出力を得るには どうしたら良いでしょうか。 そのCGIがもっている環境変数(IPアドレスとか、POSTデータ)も 渡したいのですが・・・。 Openでパイプを使ってやればいいとまではわかり、 環境変数などを渡さないで純粋にCGIを実行させて その出力を受け取るところまでは出来ました。

    • ベストアンサー
    • Perl

専門家に質問してみよう