• ベストアンサー

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

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

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

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

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

別スレッド立てられたようなので、再度前回の投稿を確認しましたが http://oshiete1.goo.ne.jp/qa2519324.html ・ヘッダの書き方 と ・必須ヘッダ については書いていますが ・環境変数にある文字列をセットしてcgiに送信する ことは書いていませんでしたね と言うかperlから別のcgiへのサーバー間通信と言う趣旨は合ってますよね?? ならば結論から書きますと リクエストヘッダに x-適当なアルファベット: 任意の文字列 \r\n を追加してください。 Apacheはそれに対してさらに頭にHTTP_を付けます。 前回のサンプルで例えば 環境変数x-test001 に"abcd" と言う文字列を入れるのなら print S "x-test001: abcd\r\n"; # <=この行を追加 print S "Content-Length: $test_len\r\n\r\n"; # ヘッダの終端なので空行も出力 これで%ENV一覧表示するcgiにアクセスすれば $ENV{'HTTP_X_TEST001'} = abcd と成ります。 このとき半角英数字なら問題ありませんが日本語だと正常に受け渡しできるかどうかは 相手のサーバーなどの仕様にもよるので やはりurlエンコード等しておいたほうが無難だと思います。 尚、このような頭に HTTP_X_ のつく環境変数は自由に設定することが出来ますが 既存の環境変数だと $ENV{'PATH_INFO'} ↑ /~tarou/test.cgiが有って /~tarou/test.cgi/test01/test02 としてリクエストすると$ENV{'PATH_INFO'} には "/test01/test02" が入ります $ENV{'QUERY_STRING'} これは勿論GETでformやURL に?付きで送れますね それら以外の既存の環境変数に変な値を入れて送ってしまうと 相手のhttpd側でエラーが出たり、正しく処理されない可能性があります。

その他の回答 (1)

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.1

UNIXならシステムの設定ファイルや起動スクリプト中に埋め込み再起動させます。 Windowsならコントロールパネルから設定できたかと思います。 もしもCGI同士のお話しで、書き込みと読み取りが別々の処理で共有できるのかということなら、結論から言いますと「不可」だと思います。 なんの役に立つかはわかりませんが、同一CGI中の同一処理内で書き込み参照する分には「可」と思います。 ただ環境変数の中にはいじると大変なことになるものもありますので参照するだけにとどめておくのが吉です。 仮にAとBというユーザがいてAが勝手に変更した環境変数がBの環境に影響を及ぼすシステム(マルチユーザ)などもってのほかだと思います。 Webからのアクセスはその都度ログインログアウトを繰り返すようなものだと思ってください。 環境変数に関しての細かな説明はネット上で検索をすればでてきますのでそちらを参照してください。 CGIなどで値を他の処理に渡したいのなら処理内で共有できるファイルなどを利用するのが良いと思います。

関連するQ&A

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

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

    • ベストアンサー
    • Perl
  • CGI:method="post"でもGETになる

    CGIで標準入力によりフォームデータを取得できないため、環境変数%ENV内の値を 調べましたところ、入力フォーム(html)のformタグでmethod="POST"と明示しているにも 拘らず、REQUEST_METHODの値がGETになっており、POST用のCONTENT_LENGTHも GET用のQUERY_STRINGも共に空になっております。 htmlでmethod="GET"と指定した場合には、REQUEST_METHODの値は正しくGETになり QUERY_STRINGからフォームデータを取得できます。 同じCGIをPC上のApache2.4でテストした結果、REQUEST_METHODはhtmlのmethod=~で 指定した通り正しくPOSTまたはGETとなり、それぞれフォームデータを 取得できることを確認いたしております。 この点についてプロバイダに問合せいたしましたが、サポート対象外ということで、 回答を得ることができませんでした。 このような現象の原因について、お心当たりのある方がおられましたら、 ご教示いただけないでしょうか、お伺いいたします。 (1)ホスト動作環境 a.CGIサーバ:Apache b. perl 5.10系 (2)PC動作環境 a.OS: Windows 7 b.ブラウザ: Internet Eexplorer 11 c.CGIサーバ: Apache 2.4 d. Activeperl 5.20

    • 締切済み
    • CGI
  • CGIからCGIを、CGI環境変数付きで実行するには?

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

    • ベストアンサー
    • Perl
  • htmlで呼び出したCGIの出力が文字化けする

    下記のInput.cgiというスクリプト(改行コードLF, 文字コードUTF-8) ---------------- #! /usr/bin/perl $method = $ENV{'REQUEST_METHOD'}; if ($method eq 'POST') { read(STDIN, $buf, $ENV{'CONTENT_LENGTH'}); } elsif ($method eq 'GET') { $buf = $ENV{'QUERY_STRING'}; } print "content-type: text/html\n\n"; print "メソッドは$methodでした。<br>\n"; print "受け取ったデータは$bufでした。\n"; ---------------- があります。これをブラウザで見ると(入力なしのまま) 「メソッドはPOSTでした。  受け取ったデータはxxxでした」 と正常に表示されます。 次に次の内容のhtml(改行はLF,文字コードはShiftJIS) ------------- <html><head> <title>FORMによるデータ転送</title></head> <body> <form method="POST" action="myInput.cgi"> <input type="text" name="text"><br> <input type=submit value="送信"> <input type=reset value="取消"> </form></body></html> -------------- をブラウザで表示させ、inputボックスに英数字(または日本語)を入力し、「送信」をクリックすると、今度はCGIスクリプト中の日本語を含めて総ての日本語出力が文字化けしてしまいます。 これが起きるのは、htmlとCGIの文字コードが異なるからでしょうか? 文字化けを止めるには何をすればよいのでしょうか? 教えて下さい。お願いいたします。

  • CGI間のデータ送信について(perl)

    perlのcgiで詰まってしまったので質問します。 現在困っていることは、cgiからcgiへの変数の値の受け渡しについてです。 色々調べてやってみたのですが、うまくいきません。 送信側で print "<form action = \"sendmail.cgi\" method=\"post\">"; print "<A href =\"sendmail.cgi?$array1[0]&$array1[1]&$array1[2]&$array1[3]\">sendmail.cgi</A>"; print "<input type=\"submit\" value=\" ボタンです。 \">"; print "</form>"; として 受信側で # postでもgetでも受信できるようにする if ($ENV{'REQUEST_METHOD'} eq "GET") { $data = '1'; $testmsg = "GETで受信"; $formdata = $ENV{'QUERY_STRING'}; print("$formdata<BR>"); } elsif ($ENV{'REQUEST_METHOD'} eq "POST"){ # こちらを使用している $data = '2'; $testmsg = "POSTで受信"; $length = $ENV{'CONTENT_LENGTH'}; read(STDIN,$formdata,$ENV{'CONTENT_LENGTH'});# $dataに受信する print("$formdata<BR>"); } else { $data = '3'; $testmsg = "受信することができませんでした。<BR>"; } としてpostにて受信しようとしています。 postのif文には入ったようなのですが、データが空っぽで何も入っていないようなのです。 何が原因なのでしょうか?助けてほしいです。

    • 締切済み
    • CGI
  • 携帯用のメールフォームのMethod

    ある、HP作成送付とを使って携帯用のメールフォーム(3機種対応)を作りましたが、既存のCGIがうまく稼動しません。 マニュアルをみると、携帯用ではMethodをPOSTではなく、GETに指定しろ。 と、有りますが、CGIのソースのどの部分を変更したらいいのか分かりません。 一応、予測してPOSTと記載されているソースを全てGET に直したのですが、旨く、稼動しません。 (「このCGIは直接稼動していません・・・」が表示される。if ($buffer eq '') ってどんな条件なんでしょうか?) 携帯用のメールフォームのCGIを配布しているサイト、もしくは下記のソースで修正すべき点をご存知の方、 教えてください!!お願いいたします。 ソース-------------------- . . . #データ入力 if ($ENV{'REQUEST_METHOD'} ne "GET") { &error('エラー','標準入力 METHOD=GET を設定してください.<br>&lt;form method=get action=........&gt;'); } read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); if ($buffer eq '') { &error('エラー','このCGIは直接起動されません.'); } $ref = $ENV{'HTTP_REFERER'}; $buffer2 = $ENV{'QUERY_STRING'}; if ($buffer2 ne '') { &error('エラー','標準入力 METHOD=GET に設定してください.<br>&lt;form method=get action=........&gt;'); }

    • ベストアンサー
    • CGI
  • 環境変数の設定

    PerlでCGIを書いています。 環境変数LD_LIBRALY_PATHを設定するのに、 Perlのスクリプト内で、$ENV{LD_LIBRARY_PATH}に値を代入しているのですが、もっとスマートな環境変数の設定法はありませんでしょうか。 残念ながら、httpd.confを書き換える権限は持っていません。 よろしくお願いします。

    • ベストアンサー
    • CGI
  • POSTでもGETでも対応するには

    Perlでプログラムを制作していたのですが、 PHPに乗り換えようと勉強中です。 ひとつのプログラムが、POSTでもGETでも 対応できるようにする場合、 Perlであれば $ENV{'REQUEST_METHOD'}の値を調べることによって 対応可能ですが、 調べてみたところ、PHPの場合はPerlの $ENV{'REQUEST_METHOD'}に相当する変数が無いように見受けられます。 どちらでも対応可能にする場合には、 どのようにコーディングすればよいのでしょうか。

    • ベストアンサー
    • PHP
  • make時に任意な文字列を渡して変数に埋めこみたい

    make時に任意の文字列を渡して、あらかじめ宣言しているグローバルな変数に設定してコンパイルしたいのですが方法あるでしょうか?

  • postで送信できないんです

    oracle plsqlで開発しています。 htmlからpostでプロシジャーに値をわたしていますが、 パラメータが渡っていないようです。 エラーページでREQUEST METHOD=GETと表示されてしまいます。 getで送るとページが表示されるのですが・・・ formタグのmethod=postにすればREQUEST METHODには自動的にPOSTがはいると 思っていたのですが、どこかで設定しなければいけないのでしょうか。 とても困っています。 どなたか教えてください。

    • 締切済み
    • CGI

専門家に質問してみよう