• ベストアンサー

環境変数リファラーの値をを最後のページまで持ちたい。

表題わかりにくくてすいません。 商品ごとの申し込みフォームを作成しています。 まず、 $ENV{'HTTP_REFERER'};でどのURLのページから来たか判別させて、 その最初に入ってきたリファラーの値をページ遷移のときに最後の ページまでもっていきたいのです。 ■1ページ目(HTML)名まえ年齢、商品番号などを記入 <A.HTML> ■2ページ目(CGI)住所 <B.CGI> sub page2{} ■3ページ目(CGI)確認画面。<C.CGI> sub page3{} ■4ページ目(CGI)サンクスページ <D.CGI> sub thanks{} 以上の4ページの構成ですが、最初の1ページ目のHTMLが商品ごとにちがっていて、どの商品のページのHTMLからきているのか判別させて、サンクスページで、URLごとに別の件名の確認メールを自分あてに送信できるようにしたいので、最初のページがどのURLなのかをリファラーで判断させたいのです。商品によって、入力項目を変えるたりもしています。(POSTで商品ごとのhiddenタグを送ればいいと思うかもしれませんが、今回は$ENV{'HTTP_REFERER'};についてのやり方でやりたいのです。) ですが、$ENV{'HTTP_REFERER'};を2ページ目のサブルーチンのなかに記述しても2ページ目ではどこからきているのか$ref = $ENV{'HTTP_REFERER'};などと記述すればわかるのですが、この最初のリファラーの値を3ページ目、4ページ目に持っていくのにはどうしたらいいのでしょうか?全部のページのサブルーチンに$ref = $ENV{'HTTP_REFERER'};を書いてしまうと、そのひとつまえのURLが認識されてしまいます。ですが、最初のリファラーの値をずっと最後のページまで持っていたいのです。 どなたか、方法がわかりましたらご教授願います。よろしくお願いいたします。

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

  • ベストアンサー
  • danmarino
  • ベストアンサー率63% (26/41)
回答No.3

no.2の補足です。 2ページ目の「B.CGI」での記述は $ref=$ENV{'HTTP_REFERER'}; と <input type="hidden" name="ref" value="$ref"> でOKです。 3ページ目以降は、そのhiddenで渡されたものをvalueに記述してあげます。 ユーザーが入力したものやhiddenで渡されるものをどのように受け取っているかわからないので正確なお答えは出来ませんが、cgi-lib.plと&ReadParse;を使っているなら3ページ目のCGIでは <input type="hidden" name="ref" value="$in{'ref'}"> という感じになると思います。 cgi-lib.plを使っていないのなら if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name,$value) = split(/=/, $pair); $FORM{$name} = $value; } のようなロジックをご自分で書いているでしょうから(上記の場合は) <input type="hidden" name="ref" value="$FORM{'ref'}"> というようになります。

ken_0401
質問者

お礼

danmarino様のおかげで無事に解決しました。 素人に対して親切丁寧な回答をして いただきまして非常に感謝しております。 ありがとうございました。

その他の回答 (3)

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.4

水を差すような回答ですが、リファラーは必ず送信されるわけではありません。 以前に読んだ「CGI プログラミング 第2版」(O'Reilly) に書いてあったのですが、 URL をキーボードから入力したりブックマークから選択した場合はリファラーは 送信されないとあります。実際に簡単なテストをしてみましたが、リンクをクリ ックした場合はリファラーは設定されましたが、ブックマークから選択した場合は 設定されませんでした。別の方法を考えるべきと思います。

  • danmarino
  • ベストアンサー率63% (26/41)
回答No.2

2番目のCGI「B.CGI」で取得した$ENV{'HTTP_REFERER'}をhiddenで次に送ってあげる方法ではダメなのでしょうか? $ENV{'HTTP_REFERER'}の取得にこだわるのであれば何か特別な理由があるのでしょうか?

ken_0401
質問者

補足

回答ありがとうございます。 >>2番目のCGI「B.CGI」で取得した$ENV{'HTTP_REFERER'}をhiddenで次に送ってあげる方法ではダメなのでしょうか? 全然ダメじゃないです。説明不足でごめんなさい。 その場合、hiddenにはどのような記述をすればいいのかわかりません。 $ref=$ENV{'HTTP_REFERER'};をCGIの最初のほうに記述してから、 フォームボタンの上に <input type="hidden" name="ref" value="$ref">\n"; とやってみましたが、これでは3ページ目以降のvalueの値は空になってしまいました。各ページへの持ち回りがうまくできません。 ご教授お願いいたします。

  • bgbg
  • ベストアンサー率53% (94/175)
回答No.1

環境変数はアクセス毎に変化するので環境変数だけでデータを永続保持できません。 セッション変数を使いましょう。 具体的な方法は CGI::Session で検索するとたくさんヒットします。

ken_0401
質問者

お礼

回答ありがとうございます。 CGI::Sessionについて勉強してみたいと思います。 ありがとうございました。